Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rabbitmq 如何在使用spring amqp库异步发送消息时使用rabbit mq处理网络超时异常_Rabbitmq_Spring Amqp_Spring Rabbit - Fatal编程技术网

Rabbitmq 如何在使用spring amqp库异步发送消息时使用rabbit mq处理网络超时异常

Rabbitmq 如何在使用spring amqp库异步发送消息时使用rabbit mq处理网络超时异常,rabbitmq,spring-amqp,spring-rabbit,Rabbitmq,Spring Amqp,Spring Rabbit,我已经编写了一个需要多个队列交互的程序——这意味着一个队列的使用者将消息写入另一个队列,同一个程序让使用者对该队列采取操作。 问题:当使用spring rabbit ampq library?或RabbitTemplate异步发送消息时,如何处理队列中的网络超时问题。如果存在网络问题,send()函数必须引发异常。 目前,我已经实现了rabbitmplate.send(),它立即返回,工作正常。但,若网络关闭,发送函数立即返回,不抛出任何异常,客户端代码假定成功。因此,我在数据库中的一致状态下成

我已经编写了一个需要多个队列交互的程序——这意味着一个队列的使用者将消息写入另一个队列,同一个程序让使用者对该队列采取操作。 问题:当使用spring rabbit ampq library?或RabbitTemplate异步发送消息时,如何处理队列中的网络超时问题。如果存在网络问题,send()函数必须引发异常。 目前,我已经实现了rabbitmplate.send(),它立即返回,工作正常。但,若网络关闭,发送函数立即返回,不抛出任何异常,客户端代码假定成功。因此,我在数据库中的一致状态下成功处理了该消息。请注意,发送调用函数包装在事务块中,目标是若队列写入失败,DB commit也必须回滚。我正在探索以下解决方案,但没有成功:

  • 我们是否可以将rabbitTemplate配置为在出现任何网络连接问题时引发运行时异常,以便通知客户端调用?请建议如何做到这一点

  • 我们是否应该使用同步发送和接收函数调用,但它会导致处理延迟?通过此函数观察到的另一个问题是,当SendReceive函数仍被阻止将消息写入队列时,我的使用者代码会收到通知。请告知我们是否可以延迟队列通知,除非返回SendReceive函数。但是,如果我们能够捕获到网络故障,那么对SendAndReceive()的调用会抛出一个amqp异常,但这会带来与性能相关的成本。 我的应用程序是多线程的,如果多个线程使用sendAndReceive()发送消息,spring amqp库如何管理队列通信?它是否为每个请求在内部创建通道?若消息是通过同一个通道传递的,那个么多线程应用程序的性能将受到很大影响

  • 有人能分享使用SendReceive函数和最佳实践的示例代码吗

  • 在提交发送函数调用之前,spring amqp库中是否有任何函数可以检查RabbitMQ服务器的运行状况?我探索了rabbitTemplate.isRunning(),但没有得到正确的结果。如果需要任何特定配置,请建议

  • < P>其他保证消息传递或处理网络超时问题的解决方案,以向客户端抛出运行时异常。


  • 根据下面的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          
    }
    
  • 启用事务,以便发送是同步的
  • 使用Publisher confirms并等待收到确认

  • 任何一个都会慢一些。

    我使用的是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的延迟消息功能来解决这个问题?我认为这会影响性能,因为我们会造成延迟,因此没有更好的解决方案。请告诉我,我不理解你的担心;最好开始一个新的问题,显示代码/配置,并清楚地解释问题。