事务如何与 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#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 设置为真,则 ClientSession#commit
和 ClientSession#rollback
什么都不做。
如果 autoCommitAcks 设置为 false,则必须在消息确认 (ClientMessage#acknowledge
) 后调用 ClientSession#commit
方法才能真正确认消息。方法 ClientSession#commit
提交所有已确认(在此会话中)和未提交的消息。可以通过调用 ClientSession#rollback
方法回滚消息确认。方法 ClientSession#rollback
回滚所有已确认(在此会话中)和未提交的消息。
我的结论正确吗?
===编辑===
我删除了这个问题中与 acknowledge 和 individualAcknowledge 相关的部分,因为它与主要问题无关并且使我的问题太复杂了。
无法使用 Artemis 核心“开始”交易 ClientSession
。如果 autoCommitSends
或 autoCommitAcks
是 false
,则会话创建后执行的任何发送或确认都将成为事务的一部分,直到 commit()
或 rollback()
叫做。根据为 autoCommitSends
和 autoCommitAcks
设置的值, 发送和确认可以是同一交易的一部分,也可以只是其中之一。
如果 autoCommit 是 true
用于发送或确认,那么调用 commit()
或 rollback()
不会对 功能 产生任何影响相应的操作。但是客户端还是会向broker发送命令,等待broker的响应。除非确实需要,否则客户有责任不调用这些操作。
我在文档中找不到有关 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#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 设置为真,则 ClientSession#commit
和 ClientSession#rollback
什么都不做。
如果 autoCommitAcks 设置为 false,则必须在消息确认 (ClientMessage#acknowledge
) 后调用 ClientSession#commit
方法才能真正确认消息。方法 ClientSession#commit
提交所有已确认(在此会话中)和未提交的消息。可以通过调用 ClientSession#rollback
方法回滚消息确认。方法 ClientSession#rollback
回滚所有已确认(在此会话中)和未提交的消息。
我的结论正确吗?
===编辑===
我删除了这个问题中与 acknowledge 和 individualAcknowledge 相关的部分,因为它与主要问题无关并且使我的问题太复杂了。
无法使用 Artemis 核心“开始”交易 ClientSession
。如果 autoCommitSends
或 autoCommitAcks
是 false
,则会话创建后执行的任何发送或确认都将成为事务的一部分,直到 commit()
或 rollback()
叫做。根据为 autoCommitSends
和 autoCommitAcks
设置的值, 发送和确认可以是同一交易的一部分,也可以只是其中之一。
如果 autoCommit 是 true
用于发送或确认,那么调用 commit()
或 rollback()
不会对 功能 产生任何影响相应的操作。但是客户端还是会向broker发送命令,等待broker的响应。除非确实需要,否则客户有责任不调用这些操作。