在Spring Integration中,我有一系列服务,如下所示:
message -> A -> B -> C -> D -> ... -> output
这很好用。我想让每个服务异步并使它们变得悲观。他们每个人都会得到一条消息,处理它并将其发送到链中的下一个服务。但是,它不会等到整个链条完成。它将继续处理下一条消息,依此类推。这里标准异步。
但是,假设服务B比A慢,并且它在其入站通道队列中累积了10k条消息,那时系统崩溃了。我希望能够通过弄清楚我离开的位置并重新处理消息来恢复系统。出于这个原因,我希望每个服务都知道它处理的哪些消息是由以下服务成功使用的。发送与处理之间的差异。
我的想法是这样做(花哨的ascii):
-> A --> B -> C -> ...
^ |
| ack |
\-----/
也就是说,A将发送给B,B将处理,当它成功完成时,它将向A发送一个确认。然后,A将从商店中删除该特定消息,以便下次运行时,它将不重新处理它。我以为我会在B之后放一个分配器,它会在服务A上调用不同的方法(即ackProcessed
)。
这是如何在SI中完成的,还是我还缺少另一种方法?我主要是要求确认我不会错过任何支持开箱即用的东西或者不会强迫我在每项服务之后创建分割器的东西。
答案 0 :(得分:1)
它不会是分裂者;更可能是pub-sub通道和ack可能想要转到A中的不同方法(即引用相同bean的不同服务激活器,不同方法;并且方法共享某些状态)。
更简单的解决方案是使用持久性消息通道(例如JMS,RabbitMQ或消息存储支持的QueueChannel)。这样,框架将为您处理一切。