Rabbitmq Spring rabbit-未触发返回回调

Rabbitmq Spring rabbit-未触发返回回调,rabbitmq,spring-amqp,Rabbitmq,Spring Amqp,当我在exchange上发布时收到Nack时,我在配置ReturnCallback时遇到问题。以下是我的工作: CachingConnectionFactory connectionFactory = new CachingConnectionFactory(); connectionFactory.setPublisherConfirms(true); connectionFactory.setPublisherReturns(true); ... RabbitTemplate rabbitT

当我在exchange上发布时收到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());
然后,当我发布消息时,我会将消息发送到不存在的exchange

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>

org.springframework.amqp
春兔
1.4.3.1发布
最后但并非最不重要的一点是,我可以在日志中看到以下错误消息:

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)
2015-03-26 16:29:24094格林尼治标准时间[pool-21-thread-1](CachingConnectionFactory.java:281)连接错误。CachingConnectionFactory:通道关闭:通道错误;协议方法:#方法(回复代码=404,回复文本=未找到-vhost'/'中没有交换'idontexist.exchange',类id=60,方法id=40)

有人看到什么不对劲吗?关于检查什么以找出什么可以阻止调用ReturnCallback的任何提示?

这就是它在Rabbit客户端中的工作方式:从代理启动
AMQImpl.Close
以关闭当前的
频道。这是因为
未找到-vhost'/'中没有exchange'idontexist.exchange'
被视为严重错误(
ChannelN#processAsync
):

因此,如果(Basic.Return的方法instanceof){
,我们就不会到达
}else


对于这种情况,
PublisherCallbackChannelImpl
调用了
handleNack
,因此-
ConfirmCallback

谢谢!我有点想象会涉及到这样的事情。现在的问题是“我能做些什么来测试ReturnCallback?”有效的
交换
,无效的
路由键
。这意味着“此路由密钥没有绑定”
if (method instanceof Channel.Close) {
       asyncShutdown(command);
       return true;
}