2016-01-06 28 views
1

我正在使用Spring AMQP进行异步消息传递。我的模型假定有两个应用程序A和B,都是生产者和消费者。Spring AMQP对消息超时采取行动

  • A向B发送工作请求并开始监听。
  • B正在监听作业请求,并且当作业完成时,启动作业并定期向A发送进度消息。
  • B在作业完成后向作业完成消息发送作业完成消息。
  • A消耗进度消息,直到工作完成消息到来,然后A存在。

我在课程级别上使用@RabbitListener,在方法级别上使用@RabbitHandler来消费消息。一切都很好,设计很干净,我喜欢Spring的解决方案。

我的问题是 - 我不知道如何检测,以及如何采取行动,当A期望从B(任何消息)接收进度信息,并且它不进来。这种情况是否有超时?如果是这样,如何实现回调方法?

我发现了一些超时设置,但它们通常适用于连接本身,或者仅在使用RPC模式时(一个请求一个响应)。

期望的解决方案是 - A应该每分钟收到进度消息。如果没有消耗进度信息,例如3分钟,我想取消该作业。

回答

1

使用异步使用者时,如果在某个时间段内没有收到消息,就没有机制生成事件。

虽然您可以安排自己的任务,但在消息到达时取消/重新安排任务。

当消息到达使用TaskScheduler

future = schedule(myRunnable, new Date(System.currentTimeMillis() + 180000));

使用future.cancel()

+0

太糟糕了,因为目前的解决方案非常干净......未来有可能要求和实施此功能吗?毕竟,本地rabbitmq客户端允许超时接收。对于Spring而言,它可能只是一个介绍事件的问题。 – waste

+0

这实际上是相当微不足道的实施(这不是第一次被要求);加上它可以避免任何竞争条件,因为可以在同一个监听器线程上发布“no message”事件。随意打开一个新功能[JIRA问题](https://jira.spring.io/browse/AMQP)。与此同时,您可以将'rabbitTemplate.receiveAndConvert()'与[配置为接收超时的模板]一起使用(http://docs.spring.io/spring- AMQP //参考/ HTML/_introduction.html#_blocking_receive_methods)。 –

+0

所以我做了,谢谢。 – waste

相关问题