我有一个与持久JMS(ActiveMQ)队列集成的Java / Akka应用程序。
PersistentQueue
包装包含批处理作业的JMS / ActiveMQ队列。在事务中接收消息,以便如果服务器在作业执行过程中出现故障,则在重新启动时将保留该作业。如果作业成功完成或被用户取消,则此事务将提交永久删除消息,如果作业失败,则事务将回滚(将消息放在队列的前面),如果作业执行的更少比MAX_RETRY次。
BatchManager
是REST控制器的接口。由于在作业执行期间调用的存储过程所施加的限制,它一次只能执行一个批处理作业。 BatchManager
从控制器接收作业并将它们发送到PersistentQueue
以放入JMS队列,然后在作业入队时轮询PersistentQueue
以获取新作业(除非另一个工作正在执行)或工作完成时。
我想删除JMS队列以及处理其JMSExceptions
的所有复杂问题,并将其替换为BatchManager
的持久邮箱。问题是我不知道如何使用持久邮箱复制JMS事务 - 我的理解是,如果服务器在作业执行期间出现故障,那么该消息将永远丢失(而不是被放回队列中)对于JMS队列。)
有没有办法用Akka持久邮箱实现事务性消息处理,这样如果服务器在执行时出现故障,消息就不会丢失?
答案 0 :(得分:1)
持久邮箱就像任何其他不太可能是交易的邮箱一样。如果演员在收到消息后崩溃,但在完成处理之前,该消息可能会丢失。
但是还有另一种类型的邮箱 - 带有Explicit Acknowledgement(又名PeekMailbox)的邮箱。 Here您可以找到用法示例。 here是实现源代码。
我认为您可以通过实施自定义持久邮箱来实现您的目标,该邮箱扩展了一些现有的实施并使用PeekMailbox功能对其进行了扩充。
答案 1 :(得分:1)
您可以使用PersistentActor来跟踪已发布和已完成的作业。
"分布式工人"激活器模板包含这样一个工作单元管理演员。 (以及动态工作者注册和聚类,但即使您不感兴趣,它仍然值得关注。)