Spring boot 如何设置spring amqp发布者确认和返回?
我是spring amqp的新手。 当config spring amqp publisher确认并返回时,遇到问题 amqp配置:Spring boot 如何设置spring amqp发布者确认和返回?,spring-boot,amqp,spring-amqp,Spring Boot,Amqp,Spring Amqp,我是spring amqp的新手。 当config spring amqp publisher确认并返回时,遇到问题 amqp配置: SimpleMessageListenerContainer container(CachingConnectionFactory connectionFactory, @Qualifier("topicListenerAdapter")MessageListenerAdapter listenerAdapter) { connectionFactory
SimpleMessageListenerContainer container(CachingConnectionFactory connectionFactory, @Qualifier("topicListenerAdapter")MessageListenerAdapter listenerAdapter) {
connectionFactory.setChannelCacheSize(5);
connectionFactory.setPublisherConfirms(true);
connectionFactory.setPublisherReturns(true);
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueueNames("request.queue","reply.queue");
container.setMessageConverter(json2MessageConverter());
container.setReceiveTimeout(3000);
container.setMessageListener(listenerAdapter);
return container;
}
发送消息:
rabbitTemplate.convertAndSend("spring-boots5", message);
rabbitTemplate.setConfirmCallback(new ConfirmCallback(){
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
// TODO Auto-generated method stub
System.out.println("confirm correlationData is : "+correlationData+"ack is : "+
ack);
}
});
rabbitTemplate.setMandatory(true);
运行此应用程序时,收到amqp消息:
Body:'This is my first message'MessageProperties [headers={bar=baz}, timestamp=null, messageId=123456, userId=null, appId=null, clusterId=null, type=null, correlationId=null, replyTo=null, contentType=text/plain, contentEncoding=null, contentLength=0, deliveryMode=PERSISTENT, expiration=null, priority=0, redelivered=false, receivedExchange=, receivedRoutingKey=request.queue, deliveryTag=1, messageCount=0]) >
met en错误:
22 20:48:08.661[0;39m [31mERROR[0;39m [35m37792[0;39m [2m---[0;39m [2m[ 127.0.0.1:5672][0;39m [36mo.s.a.r.s.PublisherCallbackChannelImpl [0;39m [2m:[0;39m No listener for seq:1
控制台上不应有字符串:
确认correlationData为:“+correlationData+”确认为:+
确认
不知道如何配置回复消息(我使用java配置)
在发送消息之前,您需要设置
ConfirmCallback
(和ReturnCallback
)
您还需要在发送时提供一些相关数据,以便确定确认用于哪个出站消息
看
@测试
public void TestPublisherConfigWithSendReceive()引发异常{
最终倒计时闩锁=新倒计时闩锁(1);
最终AtomicReference confirmCD=新的AtomicReference();
templateWithConfirmsEnabled.setConfirmCallback(新ConfirmCallback(){
@凌驾
公共无效确认(CorrelationData CorrelationData,布尔值确认,字符串原因){
confirmCD.set(correlationData);
倒计时();
}
});
SimpleMessageListenerContainer容器=新的SimpleMessageListenerContainer(此.connectionFactoryWithConfirmsEnabled);
container.setQueueNames(路由);
container.setMessageListener(新MessageListenerAdapter(新对象)(){
@抑制警告(“未使用”)
公共字符串handleMessage(字符串输入){
在.toUpperCase()中返回;
}
}));
container.start();
CorrelationData CorrelationData=新的CorrelationData(“abc”);
字符串结果=(字符串)this.templateWithConfirmsEnabled.convertSendAndReceive(路由,(对象)“消息”,关联数据);
container.stop();
assertEquals(“消息”,结果);
assertTrue(闩锁等待(10,时间单位秒));
assertEquals(correlationData,confirmCD.get());
}
我已经调整了ConfirmCallback(和ReturnCallback)
之前发送消息的位置。因为我是新手,我不知道如何设置它们(相关数据、回复队列),有一些例子吗?谢谢请参阅-我将其复制到我的答案中。rabbitmplate.convertSendAndReceive
结果是正确的。但是,confirmCD.get()是:null
和en error[127.0.0.1:5672][o.s.a.r.s.PublisherCallbackChannelImpl:没有用于seq:1的侦听器不知道原因…请显示完整的测试用例-所有内容-编辑您的问题。我把它放在[链接]()
@Test
public void testPublisherConfirmWithSendAndReceive() throws Exception {
final CountDownLatch latch = new CountDownLatch(1);
final AtomicReference<CorrelationData> confirmCD = new AtomicReference<CorrelationData>();
templateWithConfirmsEnabled.setConfirmCallback(new ConfirmCallback() {
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
confirmCD.set(correlationData);
latch.countDown();
}
});
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(this.connectionFactoryWithConfirmsEnabled);
container.setQueueNames(ROUTE);
container.setMessageListener(new MessageListenerAdapter(new Object() {
@SuppressWarnings("unused")
public String handleMessage(String in) {
return in.toUpperCase();
}
}));
container.start();
CorrelationData correlationData = new CorrelationData("abc");
String result = (String) this.templateWithConfirmsEnabled.convertSendAndReceive(ROUTE, (Object) "message", correlationData);
container.stop();
assertEquals("MESSAGE", result);
assertTrue(latch.await(10, TimeUnit.SECONDS));
assertEquals(correlationData, confirmCD.get());
}