1

这个问题直接来自在 SO 中的上一个问题。我仍然无法理解将 JMS 会话用作事务性工作单元的概念。

Java 消息服务书:

QueueConnection 对象用于创建 JMS Session 对象(特别是 Queue Session),它是 JMS 中的工作线程和事务性工作单元。与需要为每个事务性工作单元建立连接的 JDBC 不同,JMS 使用单个连接和多个 Session 对象。通常,应用程序将在应用程序启动时创建单个 JMS 连接,并维护一个 Session 对象池,以便在需要生成或使用消息时使用。

我无法理解短语transactional unit of work的含义。一个简单明了的例子解释是我在这里寻找的。

4

3 回答 3

4

一个工作单元是必须完成全部或全部完成的事情。如果它未能完成,它必须就像它从未发生过一样。

在 JTA 的说法中,工作单元由调用和调用transactional之间的资源交互组成。transaction.begin()transaction.commit()

假设您定义了一个工作单元,它从源队列中提取一条消息,在数据库中插入一条记录,然后将另一条消息放在目标队列中。在这个场景中transaction aware,资源是两个 JMS 队列和数据库。

如果在数据库插入之后发生故障,那么必须发生许多事情才能实现原子性。必须回滚数据库提交,以便您在数据源中没有孤立记录,并且必须替换从源队列中拉出的消息。

在这种人为的场景中,最终结果是,无论故障发生在哪里,unit of work结果都是您开始时的确切状态。

关于消息传递系统要记住的关键是,一个更全局的事务可以由几个较小的原子事务切换队列组成。

Queue A -> Processing Agent -> Queue B --> Processing Agent --> Queue C

虽然在这种情况下并没有真正的全局事务上下文(例如将失败B->C一直滚动回A),但您所拥有的是保证消息将被传递到链中或保留在其源队列中。这使得系统在任何时刻都保持一致。异常状态可以通过创建错误路由来处理,以实现更全局的一致性状态。

于 2013-06-27T15:28:22.610 回答
4

处理/发送全部处理的一系列消息。

于 2013-06-27T14:36:27.907 回答
0

会话可以按事务创建。对于 session.commit() 上的事务会话,此会话的消费者已收到的所有消息都已提交,即收到的消息将从其目的地(队列或主题)中删除,并且此会话的所有生产者已发送的消息对其他人可见客户。在回滚时,收到的消息会返回到它们的目的地,发送的消息会从目的地中删除。在提交/回滚之前所有发送/接收的消息都是一个工作单元。

于 2013-06-27T13:37:02.240 回答