gpt4 book ai didi

java - 使用 Akka 持久邮箱进行事务消息处理

转载 作者:行者123 更新时间:2023-11-30 03:16:57 27 4
gpt4 key购买 nike

我有一个与持久 JMS 集成的 Java/Akka 应用程序( ActiveMQ ) 队列。

PersistentQueue 包装了一个包含批处理作业的 JMS/ActiveMQ 队列。消息是在事务中接收的,因此如果服务器在作业执行过程中出现故障,则作业将在重新启动时保留。如果作业成功完成或被用户取消,则提交此事务以永久删除消息,如果作业失败,则如果作业执行次数较少,则回滚事务(将消息放在队列的前面)超过 MAX_RETRY 次。

BatchManager 是与 REST Controller 的接口(interface)。由于作业执行期间调用的存储过程所施加的限制,它一次只能执行一个批处理作业。 BatchManager 从 Controller 接收作业并将其发送到 PersistentQueue 以放入 JMS 队列中,然后轮询 PersistentQueue 以获取新的作业当作业排队时(除非另一个作业正在执行)或作业完成时。

我想删除 JMS 队列以及处理其 JMSExceptions 的所有复杂情况,并将其替换为 BatchManager 的持久邮箱。问题是我不知道如何使用持久邮箱复制 JMS 事务 - 我的理解是,如果服务器在作业执行期间出现故障,那么该消息将永远丢失(而不是放回到队列中等待JMS 队列)。

是否有一种方法可以使用 Akka 持久邮箱进行事务性消息处理,以便在服务器执行时发生故障时消息不会丢失?

最佳答案

Akka documentation说:

A durable mailbox is like any other mailbox not likely to be transactional. It's possible if the actor crashes after receiving a message, but before completing processing of it, that the message could be lost.

但还有另一种类型的邮箱 - 带有显式确认的邮箱(又名 PeekMailbox)。 Here你可以找到使用示例。和here是实现源码。

我认为您可以通过实现自定义持久邮箱来实现您的目标,该邮箱扩展了一些现有实现并通过 PeekMailbox 功能对其进行了增强。

关于java - 使用 Akka 持久邮箱进行事务消息处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32344298/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com