【问题标题】:How do transactions work with the ActiveMQ Artemis core client?事务如何与 ActiveMQ Artemis 核心客户端一起工作?
【发布时间】: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


【解决方案1】:

没有办法使用 Artemis 核心 ClientSession“启动”事务。如果autoCommitSends 或autoCommitAcks 是false,则会话创建后执行的任何发送或确认都将成为事务的一部分,直到调用commit() 或rollback()。根据为autoCommitSends 和autoCommitAcks 设置的值两者发送和确认可以是同一事务的一部分,也可以只是其中之一。

如果发送或确认的 autoCommit 为 true,则调用 commit() 或 rollback() 不会对相应操作产生任何功能影响。但是,客户端仍然会向代理发送命令并等待代理的响应。除非确实有必要,否则不调用这些操作是客户的责任。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    相关资源
    最近更新 更多