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