我已经在 Camel 路由中实现了一项服务,该服务使用了ActiveMQ队列中的消息,进行了一些处理并将其发送到外部系统。
如果在调用外部系统时出现问题,则必须将消息ID通知回调用后端系统。由于必须维持消息顺序,因此服务需要推迟已经排队的消息和后续消息,直到解决错误情况为止。
实际上,由于已处理失败的消息,因此必须将其从队列中删除,因此它无法执行。与 Camel 重新交付相比,这可能有所不同。
后端系统应控制进一步的过程。要么再次发送有问题的消息,然后服务应处理此一条消息(由其ID标识),然后继续处理延迟的消息。或后端发送一些继续信号,该信号指示服务继续处理延迟的消息,尽管失败的消息不再出现。这两个选项都可以解决错误情况。
到目前为止,我已经考虑过实现涉及多个队列的某种基于 Camel 的交换,路由决定路由是否可以直接处理传入消息或是否有延迟消息要处理。但是我不知道是否有一些EIP可以巧妙地描述这种情况。
您能以一种喜剧的方式给我一些建议吗?
最佳答案
您所描述的听起来(至少对我而言)听起来像是经过精心设计的工作流程而不是单个EIP。这完全可以使用事件驱动的系统来完成,但是当试图将其强制为仅使用一个队列解决方案和单个EIP时,通常会变得很脆弱。
多队列/多 Camel 路由方法是直截了当的,不需要任何不自然的行为(停止路由,重新排队所有内容等)来通常维护消息的排序等。
关于error-handling - Camel : defer ActiveMQ messages until error condition gets resolved,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36100180/