这个问题直接来源于SO中的我以前的问题。我仍然无法理解JMS会话被用作事务工作单元的概念。
来自Java消息服务的书:
QueueConnection对象用于创建JMS对象(特别是队列会话),它是JMS中的工作线程和事务工作单元。与JDBC不同,JDBC为每个事务工作单元都需要一个连接,JMS使用单个连接和多个会话对象。通常,应用程序将在应用程序启动时创建单个JMS连接,并维护一个会话对象池,以便在需要生成或使用消息时使用。
我无法理解事务性工作单位这一短语的含义。我在这里寻找的是一个简单而简单的例子。
发布于 2013-06-27 15:28:22
一个单位的工作是必须完成所有或什么都不做的事情。如果它不能完成,它肯定是从来没有发生过的。
在JTA术语中,工作单元由transaction.begin()
调用和transaction.commit()
调用之间与transaction.begin()
资源的交互组成。
假设您定义了一个工作单元,它可以提取源队列的消息,在数据库中插入记录,并将另一条消息放置在目标队列中。在这个场景中,transaction aware
资源是两个JMS和数据库。
如果在数据库插入后发生故障,那么必须发生一些事情才能实现原子性。必须回滚数据库提交,以便在数据源中没有孤立的记录,并且必须替换从源队列中提取的消息。
这个精心设计的场景中的净输出是,无论unit of work
中的故障发生在哪里,结果都是您开始时所处的确切状态。
关于消息传递系统,要记住的关键是,一个更全局的事务可以由几个较小的原子事务切换队列组成。
Queue A -> Processing Agent -> Queue B --> Processing Agent --> Queue C
虽然在这个场景中并没有真正的全局事务上下文(例如,在B->C
中一直滚动到A
的失败),但您所拥有的是消息将沿着链传递或保留在它们的源队列中。这使得系统在任何时候都是一致的。可以通过创建错误路由来处理异常状态,以实现更全局的一致性状态。
发布于 2013-06-27 14:36:27
处理/发送(所有或none )的一系列消息。
发布于 2013-06-27 13:37:02
会话可以作为事务创建。对于session.commit()上的事务会话,此会话的使用者收到的所有消息都已提交,接收到的消息将从其目的地(队列或主题)中移除,并且该会话的所有生产者发送的消息对其他客户端都是可见的。在回滚时,接收到的邮件返回其目的地,从目的地删除发送的邮件。在提交/回滚之前,所有发送/接收的消息都是一个工作单元。
https://stackoverflow.com/questions/17343795
复制相似问题