0

我需要在重试上实现一个逻辑。入站端点将消息推送到 Rest(出站)。如果 REST 不可用,我需要重试 1 次并将其放入队列中。但是第二个即将到来的消息不应该做任何重试,它必须直接将消息放入队列,直到 REST 服务可用。

一旦服务可用,我需要通过批处理作业将所有消息从 QUEUE 推送到 REST 服务(按顺序)。

问题:

  1. 我如何知道我的第二条消息无法使用该服务?如果我使用直到成功,对于每条消息,它都会重试并放入队列。Plm 是第二条消息不应该重试。

  2. 对于批处理,我想到了使用轮询,但是如何告诉轮询,何时服务可用以开始批处理。(bcz,Poll 更多的是配置运行批处理的时间)?

  3. 其他让我感到困惑的是 - 必须保留这里的顺序。一旦服务可用。队列消息(即批处理)必须首先移动到 REST 服务,然后才能实时移动。我怀疑它是否适用。

    这对于快速响应实现逻辑非常有帮助。

使用骡子:3.5.1

4

2 回答 2

1

我可以尝试以下方法:使用流控制

  1. 处理消息;如果出现异常或错误的响应代码,请设置一个变量/属性,如 serviceAvailable=false。
  2. 后续的消息处理会先检查属性 serviceAvailable 来处理消息。如果属性为假,则将消息排队到状态=新/未处理的数据库表
  3. 创建一个流/调度程序来按顺序处理来自 DB 的消息,但它不会检查属性 serviceAvailable 并调用其余服务。如果服务抛出异常,它将不会再次将消息存储在数据库中,但如果进程成功更改属性 serviceAvailable=true 并将消息出队或更改状态。如果 db 表中有更多消息,例如 moreDBMsg=true,则添加另一个属性并将其设置为 true。在 moreDBMsg=false 一次 moreDBMsg=false 和 serviceAvailable=true 开始处理来自队列的消息之前,不应处理/消费新消息。
于 2014-09-08T18:35:52.437 回答
0

对于超时,我仍然会查看响应代码并捕获超时以确定调用是否成功或需要重试。实际上,无论如何您通常都会进行多线程处理,因此无论如何您都有多个并行调用。或者只是一个电话在另一个电话结束之前开始。这很正常。

但是您可以简单地在超时的队列中重试呼叫。在 x 次超时后,您“跳过”或推迟重试。

但是所有这些都是使用实际的 Mule 流组件完成的,例如:

队列的一种可能性是将其保存在数据库中。Mule 具有具有“轮询”功能的数据库连接器,请参阅: http: //www.mulesoft.org/documentation/display/current/JDBC+Transport+Reference#JDBCTransportReference-PollingTransport

于 2014-09-08T08:56:29.150 回答