Rabbitmq 如何在使用spring amqp库异步发送消息时使用rabbit mq处理网络超时异常
我已经编写了一个需要多个队列交互的程序——这意味着一个队列的使用者将消息写入另一个队列,同一个程序让使用者对该队列采取操作。 问题:当使用spring rabbit ampq library?或RabbitTemplate异步发送消息时,如何处理队列中的网络超时问题。如果存在网络问题,send()函数必须引发异常。 目前,我已经实现了rabbitmplate.send(),它立即返回,工作正常。但,若网络关闭,发送函数立即返回,不抛出任何异常,客户端代码假定成功。因此,我在数据库中的一致状态下成功处理了该消息。请注意,发送调用函数包装在事务块中,目标是若队列写入失败,DB commit也必须回滚。我正在探索以下解决方案,但没有成功:Rabbitmq 如何在使用spring amqp库异步发送消息时使用rabbit mq处理网络超时异常,rabbitmq,spring-amqp,spring-rabbit,Rabbitmq,Spring Amqp,Spring Rabbit,我已经编写了一个需要多个队列交互的程序——这意味着一个队列的使用者将消息写入另一个队列,同一个程序让使用者对该队列采取操作。 问题:当使用spring rabbit ampq library?或RabbitTemplate异步发送消息时,如何处理队列中的网络超时问题。如果存在网络问题,send()函数必须引发异常。 目前,我已经实现了rabbitmplate.send(),它立即返回,工作正常。但,若网络关闭,发送函数立即返回,不抛出任何异常,客户端代码假定成功。因此,我在数据库中的一致状态下成
根据下面的Gary评论,我已设置:rabbitTemplate.setChannelTransaction(true);它使通话同步。问题的下一部分是,若在外部块上有事务块,那个么对rabbitmplate.send()的调用将立即返回。我期望外部函数的事务块必须等待内部函数返回,否则,我不会得到预期的结果,因为我的DB更改被持久化,尽管我们启用了setChannelTransaction为true。我尝试了各种事务传播级别,但没有成功。如果我做错了什么,请给出建议,并按以下方式查看事务传播设置
@Transactional
public void notifyQueueAndDB(DBRequest dbRequest) {
logger.info("Updating Request in DB");
dbService.updateRequest(dbRequest));
//Below is call to RabbitMQ library
mqService.sendmessage(dbRequest); //If sendMessage fails because of network outage, I want DB commit also to be rolled-back.
}
MQService在另一个项目库中定义,代码段如下
@Transactional( propagation = Propagation.NESTED)
private void sendMessage(......) {
....
rabbitTemplate.send(this.queueExchange, queueName, amqpMessage);
}catch (Exception exception) {
throw exception
}
任何一个都会慢一些。我使用的是spring-amqp库版本:2.0.3.RELEASE.Gary,我启用了rabbitTemplate.SetChannelTransactive(true)并启用了同步api调用。非常感谢。在我的帖子中,我对渠道管理有疑问。我的应用程序是多线程的,如果多个线程使用send()发送消息,spring amqp库如何管理队列通信?它是否为每个请求在内部创建通道?或者所有线程消息都通过同一个通道传递,线程处于等待状态,直到sync call中的send()函数。Gary,我更新了代码和详细信息,说明由于多个事务行为,网络超时问题仍然不起作用。您能检查上面的代码和事务传播设置吗?框架缓存通道;每次发送都会从缓存中检出一个通道(如果缓存为空,则创建一个新通道),并在发送完成时将其返回到缓存。在输入方法之前,您需要启动两个事务-例如,使用同时包含DB和Rabbit事务管理器的
ChainedTransactionManager
。您需要决定事务开始的顺序(并以相反的顺序提交)。谢谢,Gary,我启用了Chained Transaction manager,它解决了事务问题。现在,它为我的用例带来了另一个挑战。当我的函数从tx manager接收到2pc时,消息已经提交到队列,消费者激活。此使用者根据上次数据库更新采取操作,但遗憾的是,这些操作未提交。经过探索,我正在考虑使用Rabbit MQ exchange的延迟消息功能来解决这个问题?我认为这会影响性能,因为我们会造成延迟,因此没有更好的解决方案。请告诉我,我不理解你的担心;最好开始一个新的问题,显示代码/配置,并清楚地解释问题。