事务如何与 ActiveMQ Artemis 核心客户端一起工作?

How do transactions work with the ActiveMQ Artemis core client?

我在文档中找不到有关 artemis 交易的足够信息。我不清楚 artemis 交易是如何运作的,所以我想澄清一下。 org.apache.activemq.artemis.api.core.client.ClientSession class中有两种方法:

 /**
    * 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 中的交易到底是什么。可以提交或回滚哪些操作?

我测试了几个场景,我有我的结论。 Thera有两个可以提交或回滚的操作:消息发送和消息接收(确认)。方法 ClientSession#commitClientSession#rollback 仅用于提交和回滚消息发送和确认。不需要任何方法来开始交易。只有未提交的消息可以提交或回滚。可以在会话创建期间使用的两个参数 autoCommitSendsautoCommitAcks 对 artemis 事务至关重要。

让我们考虑发送消息。

如果 autoCommitSends 设置为 true,则 ClientSession#commitClientSession#rollback 什么都不做。

如果 autoCommitSends 设置为 false,则必须在发送消息 (ClientProducer#send) 后调用 ClientSession#commit 方法才能真正发送消息。方法 ClientSession#commit 提交所有已发送(在此会话中)和未提交的消息。可以通过调用 ClientSession#rollback 方法回滚消息。方法 ClientSession#rollback 回滚所有已发送(在此会话中)和未提交的消息。

让我们考虑接收消息。

如果 autoCommitAcks 设置为真,则 ClientSession#commitClientSession#rollback 什么都不做。

如果 autoCommitAcks 设置为 false,则必须在消息确认 (ClientMessage#acknowledge) 后调用 ClientSession#commit 方法才能真正确认消息。方法 ClientSession#commit 提交所有已确认(在此会话中)和未提交的消息。可以通过调用 ClientSession#rollback 方法回滚消息确认。方法 ClientSession#rollback 回滚所有已确认(在此会话中)和未提交的消息。

我的结论正确吗?

===编辑===

我删除了这个问题中与 acknowledge 和 individualAcknowledge 相关的部分,因为它与主要问题无关并且使我的问题太复杂了。

无法使用 Artemis 核心“开始”交易 ClientSession。如果 autoCommitSendsautoCommitAcksfalse,则会话创建后执行的任何发送或确认都将成为事务的一部分,直到 commit()rollback()叫做。根据为 autoCommitSendsautoCommitAcks 设置的值, 发送和确认可以是同一交易的一部分,也可以只是其中之一。

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