basicAck(知识)时rabbitMQ AlreadyClosedException

rabbitMQ AlreadyClosedException when basicAck(knowledging)

我的 groovy 代码使用 grails 的 Rabbit Native 插件:

def handleMessage(def body, MessageContext context) {
    // With noAck=false, messages must be acknowledged manually with basic.ack.
    boolean noAck = false
    // send Ack on true and nack on false
    if(processMessage(new SensorEvent(body))){
           context.channel.basicAck(context.getEnvelope().getDeliveryTag(),noAck)
    }else{
        context.channel.basicNack(context.getEnvelope().getDeliveryTag(), false, false);

    }
    return ''
}

如果我注释掉执行 Ack 和 Nack 的两行代码,一切正常。如果我取消注释 basicAck,我会得到以下异常

com.rabbitmq.client.AlreadyClosedException: channel is already closed due to channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - unknown delivery tag 1, class-id=60, method-id=80)
at com.rabbitmq.client.impl.AMQChannel.ensureIsOpen(AMQChannel.java:195)
at com.rabbitmq.client.impl.AMQChannel.transmit(AMQChannel.java:309)
at com.rabbitmq.client.impl.AMQChannel.transmit(AMQChannel.java:303)
at com.rabbitmq.client.impl.ChannelN.basicReject(ChannelN.java:1045)
at com.rabbitmq.client.impl.recovery.RecoveryAwareChannelN.basicReject(RecoveryAwareChannelN.java:72)
at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.basicReject(AutorecoveringChannel.java:354)

我看到建议使用 Subscription.Ack()。 Java/Groovy rabbitMQ 中没有订阅 class。

知道我为什么会遇到异常吗?

编辑:因为我使用的是本机插件,所以我需要创建一个实现接口的消费者

def handleMessage(def body, MessageContext context)

订阅处理方式:

 /**
 * Consumer configuration.
 */
static rabbitConfig = [
        "queue": "my.queueName"
]

这个错误:

PRECONDITION_FAILED - unknown delivery tag 1,

表示您正尝试在与接收所述消息的频道不同的频道上确认消息。交付标签按渠道划分范围