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