此问题直接来自SO中的previous question of mine。我仍然无法理解将JMS会话用作事务性工作单元的概念。
QueueConnection对象用于创建JMS会话对象 (具体来说,是一个队列会话),这是工作线程和 JMS中的事务工作单元。与JDBC不同,它需要一个 对于每个事务工作单元的连接,JMS使用单个 连接和多个Session对象。通常,应用程序会 在应用程序启动时创建单个JMS连接并维护 每当消息需要时使用的Session对象池 生产或消费。
我无法理解短语交易工作单元的含义。一个简单而简单的解释是一个例子,我在这里寻找。
答案 0 :(得分: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
),但您所拥有的是消息将是garauntees从链中传送或保留在源队列中。这使得系统在任何时刻都保持一致。可以通过创建错误路由来处理异常状态,以实现更全局的一致性状态。
答案 1 :(得分:2)
处理/发送全部或无的一系列消息。
答案 2 :(得分:0)
会话可以创建为交易。对于session.commit()上的事务会话,此会话的消费者已收到的所有消息都已提交,即已接收的消息将从其目标(队列或主题)中删除,并且此会话的所有生成者已发送的消息对其他人可见客户端。在回滚时,收到的消息将返回到目标,从目标中删除已发送的消息。所有发送/接收的消息,直到提交/回滚为一个工作单元。