Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “a”是什么;“事务性工作单位”;用简单的英语?_Java_Transactions_Jms_Messaging - Fatal编程技术网

Java “a”是什么;“事务性工作单位”;用简单的英语?

Java “a”是什么;“事务性工作单位”;用简单的英语?,java,transactions,jms,messaging,Java,Transactions,Jms,Messaging,这个问题直接来自SO中的a。我仍然无法理解将JMS会话用作事务性工作单元的概念 书中: QueueConnection对象用于创建JMS会话对象 (特别是队列会话),它是工作线程和 JMS中的事务工作单元。与JDBC不同,JDBC需要 对于每个事务性工作单元,JMS使用单个 连接和多个会话对象。通常,应用程序将 在应用程序启动时创建单个JMS连接并维护 需要发送消息时使用的会话对象池 产生或消费的 我无法理解“事务性工作单元”一词的含义。我在这里要找的是一个简单明了的解释和一个例子。会话可以作为

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

书中:

QueueConnection对象用于创建JMS会话对象 (特别是队列会话),它是工作线程和 JMS中的事务工作单元。与JDBC不同,JDBC需要 对于每个事务性工作单元,JMS使用单个 连接和多个会话对象。通常,应用程序将 在应用程序启动时创建单个JMS连接并维护 需要发送消息时使用的会话对象池 产生或消费的


我无法理解“事务性工作单元”一词的含义。我在这里要找的是一个简单明了的解释和一个例子。

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

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

一系列处理/发送所有的消息。

一系列处理/发送所有的消息。

一个工作单元必须完成全部或不完成。如果它不能完成,那就好像它从未发生过一样

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

假设您定义了一个工作单元,用于提取源队列的消息,在数据库中插入一条记录,并将另一条消息放入目标队列。在这个场景中,事务感知资源是两个JMS队列和数据库

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

在这个人为设计的场景中,最终的结果是,无论在
工作单元的哪个位置发生故障,结果都是您开始时的确切状态

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

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

在这种情况下,实际上并不存在全局事务上下文(例如,将
B->C
中的故障回滚到
a
),但您所拥有的是消息将沿着链传递或保留在源队列中的Garaunite。这使得系统在任何时刻都保持一致。异常状态可以通过创建错误路由来处理,以实现更全局的一致性状态。

一个工作单元必须完成全部或全部。如果它不能完成,那就好像它从未发生过一样

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

假设您定义了一个工作单元,用于提取源队列的消息,在数据库中插入一条记录,并将另一条消息放入目标队列。在这个场景中,事务感知资源是两个JMS队列和数据库

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

在这个人为设计的场景中,最终的结果是,无论在
工作单元的哪个位置发生故障,结果都是您开始时的确切状态

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

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

在这种情况下,实际上并不存在全局事务上下文(例如,将
B->C
中的故障回滚到
a
),但您所拥有的是消息将沿着链传递或保留在源队列中的Garaunite。这使得系统在任何时刻都保持一致。可以通过创建错误路由来处理异常状态,以实现更全局的一致性状态。

“可以通过创建错误路由来处理异常状态,以实现更全局的一致性状态。”这是什么意思?你能详细说明一下吗?当然可以。我的意思是让你的处理代理决定把东西放在哪个队列上。因此,您的处理代理会检测到问题,而不是失败并回滚事务,您可以选择将消息路由到处理错误状态的队列。“可以通过创建的错误路由来处理异常状态,以实现更全局的一致性状态。”您可以