Spring-rabbit - ReturnCallback 未触发
Spring-rabbit - ReturnCallback not triggered
当我在交易所发布时收到 Nack 时,我在配置 ReturnCallback 时遇到问题。这是我的工作:
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setPublisherConfirms(true);
connectionFactory.setPublisherReturns(true);
...
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory());
rabbitTemplate.setMandatory(true);
rabbitTemplate.setConfirmCallback(new MyMessageConfirmCallback());
rabbitTemplate.setReturnCallback(new MyMessageReturnCallback());
然后当我发布一条消息时,我将一条消息发送到一个不存在的交易所
notificationProducerJmsTemplate.send("idontexist.exchange",
"idontexist.key",
messageToSend,
correlationData);
奇怪的是,我到达了 MyMessageConfirmCallback
中定义的代码,但没有到达 MyMessageReturnCallback
中定义的代码,即使在第一个中 ack
的值是 false
.
我正在使用 RabbitMQ 3.4.2,这是我的 maven 依赖项:
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>1.4.3.RELEASE</version>
</dependency>
最后但同样重要的是,这是我在日志中看到的错误消息:
2015-03-26 16:29:24,094 GMT [pool-21-thread-1] (CachingConnectionFactory.java:281) ERROR connection.CachingConnectionFactory: Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange 'idontexist.exchange' in vhost '/', class-id=60, method-id=40)
有人发现问题了吗?关于检查什么以找出可能阻止调用 ReturnCallback 的任何提示?
这就是它在 Rabbit Client 中的工作方式:AMQImpl.Close
从 Broker 启动以关闭当前的 Channel
。那是因为 NOT_FOUND - no exchange 'idontexist.exchange' in vhost '/'
被视为严重错误 (ChannelN#processAsync
):
if (method instanceof Channel.Close) {
asyncShutdown(command);
return true;
}
因此我们无法从那里到达 } else if (method instanceof Basic.Return) {
。
对于这种情况,PublisherCallbackChannelImpl
调用 handleNack
,因此 - ConfirmCallback
。
当我在交易所发布时收到 Nack 时,我在配置 ReturnCallback 时遇到问题。这是我的工作:
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setPublisherConfirms(true);
connectionFactory.setPublisherReturns(true);
...
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory());
rabbitTemplate.setMandatory(true);
rabbitTemplate.setConfirmCallback(new MyMessageConfirmCallback());
rabbitTemplate.setReturnCallback(new MyMessageReturnCallback());
然后当我发布一条消息时,我将一条消息发送到一个不存在的交易所
notificationProducerJmsTemplate.send("idontexist.exchange",
"idontexist.key",
messageToSend,
correlationData);
奇怪的是,我到达了 MyMessageConfirmCallback
中定义的代码,但没有到达 MyMessageReturnCallback
中定义的代码,即使在第一个中 ack
的值是 false
.
我正在使用 RabbitMQ 3.4.2,这是我的 maven 依赖项:
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>1.4.3.RELEASE</version>
</dependency>
最后但同样重要的是,这是我在日志中看到的错误消息:
2015-03-26 16:29:24,094 GMT [pool-21-thread-1] (CachingConnectionFactory.java:281) ERROR connection.CachingConnectionFactory: Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange 'idontexist.exchange' in vhost '/', class-id=60, method-id=40)
有人发现问题了吗?关于检查什么以找出可能阻止调用 ReturnCallback 的任何提示?
这就是它在 Rabbit Client 中的工作方式:AMQImpl.Close
从 Broker 启动以关闭当前的 Channel
。那是因为 NOT_FOUND - no exchange 'idontexist.exchange' in vhost '/'
被视为严重错误 (ChannelN#processAsync
):
if (method instanceof Channel.Close) {
asyncShutdown(command);
return true;
}
因此我们无法从那里到达 } else if (method instanceof Basic.Return) {
。
对于这种情况,PublisherCallbackChannelImpl
调用 handleNack
,因此 - ConfirmCallback
。