我正在阅读有关rabbitmq中
Channel.basicCancel
操作的文档https://www.rabbitmq.com/consumer-cancel.html。文档表示,可能的取消情况之一是消费者在其正在侦听的同一频道上发送取消信号。
这是唯一的可能性吗?您可以取消在不同通道/连接/进程上运行的远程消费者吗?
我正在尝试从另一个进程发送取消请求。当我这样做时,它会以异常结束
java.io.IOException: Unknown consumerTag
,就像这样的操作仅限于取消本地消费者(在自己的通道或连接上)。
更新:
我注意到这个“Unknown ConsumerTag”异常是 com.rabbitmq.client.impl.ChannelN.basicCancel(String) 内部初始验证的结果:
Consumer originalConsumer = (Consumer)this._consumers.get(consumerTag);
if (originalConsumer == null) {
throw new IOException("Unknown consumerTag");
}
...
但仍然可能有一些 rpc 调用可以解决问题......
文档是正确的,您必须从其自己的通道/连接中取消消费者。
其他选项包括让您的消费者意识到“取消消息”,这将导致他们自行停止,或者使用 API 关闭整个连接,这将关闭与其关联的所有通道。