【发布时间】:2020-11-12 00:20:14
【问题描述】:
我在文档中找不到有关 artemis 交易的足够信息。我不清楚 artemis 交易是如何运作的,所以我想澄清一下。
org.apache.activemq.artemis.api.core.client.ClientSession类中有两个方法:
/**
* Commits the current transaction, blocking.
*
* @throws ActiveMQException if an exception occurs while committing the transaction
*/
void commit() throws ActiveMQException;
和
/**
* Rolls back the current transaction.
*
* @throws ActiveMQException if an exception occurs while rolling back the transaction
*/
void rollback() throws ActiveMQException;
我找不到任何开始交易的方法,我不知道 artemis 中的交易到底是什么。哪些操作可以提交或回滚?
我已经测试了几个场景,我得出了我的结论。有两个可以提交或回滚的操作:消息发送和消息接收(确认)。方法ClientSession#commit 和ClientSession#rollback 仅用于提交和回滚消息发送和确认。开始交易不需要任何方法。只有未提交的消息可以提交或回滚。可以在会话创建期间使用的两个参数 autoCommitSends 和 autoCommitAcks 对于 artemis 事务至关重要。
让我们考虑发送消息。
如果 autoCommitSends 设置为 true,则 ClientSession#commit 和 ClientSession#rollback什么都不做。
如果 autoCommitSends 设置为 false,则必须在发送消息 (ClientProducer#send) 后调用 ClientSession#commit 方法才能真正发送消息。方法ClientSession#commit 提交所有已发送(在此会话中)和未提交的消息。可以通过调用ClientSession#rollback 方法回滚消息。方法ClientSession#rollback 回滚所有已发送(在此会话中)和未提交的消息。
让我们考虑接收消息。
如果 autoCommitAcks 设置为 true,则 ClientSession#commit 和 ClientSession#rollback什么都不做。
如果 autoCommitAcks 设置为 false,则必须在消息确认 (ClientMessage#acknowledge) 后调用 ClientSession#commit 方法才能真正确认按摩。方法ClientSession#commit 提交所有已确认(在此会话中)和未提交的消息。可以通过调用ClientSession#rollback 方法回滚消息确认。方法 ClientSession#rollback 回滚所有已确认(在此会话中)和未提交的消息。
我的结论正确吗?
===编辑===
我删除了此问题中与确认和个人确认相关的部分内容,因为它与主要问题无关并且使我的问题过于复杂。
【问题讨论】:
-
这里有很多问题(显式和隐式)。它们都是关于交易的,但您需要关注个别问题。例如,也许只是在这个问题中询问
acknowledge和individualAcknowledge之间的关系,并创建一个关于如何启动事务、自动提交如何工作等的新问题。 -
在 Stack Overflow 上,问题应该只关注 single 问题。当您提出多个问题时,很难确定正确的答案。例如,如果答案只解决了您问题的一部分怎么办?假设它是准确的,它是否“正确”?如果有 2 个答案,并且每个答案都准确地解决了您问题的不同部分,该怎么办。哪一个是“正确的”?这种模棱两可不利于社区参与并贬低内容。
-
问题是关于交易的,所以我希望得到关于交易的答案。你说得对,我不必要地提到了承认和个人承认。我将从问题中删除这部分。
-
您问,“哪些操作可以提交或回滚?”然后你问:“我的结论正确吗?”然而,你有很多结论,每一个都可能需要解决。此外,您无需在问题中添加消息来解释您的编辑。任何人都可以查看编辑历史,看看你做了什么。您甚至可以提供将出现在编辑历史记录中的简短说明。
标签: activemq-artemis