RabbitMQ确保消息到达队列

RabbitMQ确保消息到达队列,rabbitmq,spring-amqp,spring-rabbit,Rabbitmq,Spring Amqp,Spring Rabbit,我想确定消息是否到达队列。 否则,我想要一个例外 我已经尝试过publisher returns,但这不是我所需要的,因为它位于不同的线程上,我认为在发送消息的线程上等待它是很困难的 如果没有事务通道,当exchange不在时convertAndSend方法成功返回,事务通道现在抛出异常 当没有基于路由密钥的路由时,我需要的是相同的 @springboot应用程序 公共类演示应用程序{ 私有静态最终记录器log=Logger.getGlobal(); 公共静态void main(字符串[]arg

我想确定消息是否到达队列。 否则,我想要一个例外

我已经尝试过publisher returns,但这不是我所需要的,因为它位于不同的线程上,我认为在发送消息的线程上等待它是很困难的

如果没有事务通道,当exchange不在时convertAndSend方法成功返回,事务通道现在抛出异常

当没有基于路由密钥的路由时,我需要的是相同的

@springboot应用程序
公共类演示应用程序{
私有静态最终记录器log=Logger.getGlobal();
公共静态void main(字符串[]args){
run(DemoApplication.class,args);
}
@豆子
RabbitTemplate RabbitTemplate(连接工厂连接工厂){
RabbitTemplate RabbitTemplate=新的RabbitTemplate(连接工厂);
rabbitTemplate.setReturnCallback((消息、replyCode、replyText、exchange、routingKey)->log.info(replyCode+,“+replyText));
rabbitTemplate.SetChannelTransactived(true);
rabbitTemplate.setMandatory(true);
返回兔模板;
}
@豆子
CommandLineRunner CommandLineRunner(RabbitTemplate RabbitTemplate){
返回参数->{
rabbitTemplate.convertAndSend(“exchangeName”、“routingKey”、“message”);
log.info(“发送完成”);
};
}
}
唯一属性:spring.rabbitmq.publisher返回=true

Spring启动版本:2.1.7.0版本

实际值

无exchange->convertAndSend引发异常

在exchange->method返回时没有路由

预期的

无exchange->convertAndSend引发异常

exchange->convertAndSend没有路由引发异常


您需要使用publisher确认和关联数据:

spring.rabbitmq.publisher-returns=true
spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.template.mandatory=true
@springboot应用程序
公共类SO57464212应用程序{
公共静态void main(字符串[]args){
SpringApplication.run(So57464212Application.class,args);
}
@豆子
公共应用程序运行程序(RabbitTemplate模板){
setReturnCallback((消息、replyCode、replyText、exchange、routingKey)->{
System.err.println(“返回:+replyText”);
});
template.setConfirmCallback((correlationData,ack,cause)->{
系统错误打印项次(“确认:+ack”);
});
返回参数->{
CorrelationData CorrelationData=新的CorrelationData(“foo”);
template.convertAndSend(“,”NOQUEUE“,”bar“,”correlationData);
correlationData.getFuture().get(10,TimeUnit.SECONDS);
if(correlationData.getReturnedMessage()!=null){
抛出新的RuntimeException(“返回消息”);
}
};
}
}

现在没有路由是好的,但是现在通道没有交易,没有交换时convertAndSend会毫无例外地返回。这是正确的;很遗憾,您不能同时在通道上启用事务和确认。我不相信您的两个要求能够得到满足,但您可以尝试询问
rabbitmq用户
谷歌组,rabbitmq工程师在哪里闲逛。我们现在使用默认的交换,因此路由密钥是队列的名称,工作正常,谢谢!