事务如何使用ActiveMQ Artemis核心客户端



我在文档中找不到足够的关于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#commitClientSession#rollback仅用于提交和回滚消息发送和确认。不需要任何方法来开始事务。只有未提交的消息可以提交或回滚。可以在会话创建过程中使用的两个参数autoCommitSendsautoCommitAcks对artemis事务至关重要。

让我们考虑发送消息

如果autoCommitSends设置为true,则ClientSession#commitClientSession#rollback不执行任何操作。

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

让我们考虑接收消息

如果autoCommitAcks设置为true,则ClientSession#commitClientSession#rollback不执行任何操作。

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

我的结论正确吗?

===EDIT===

我删除了这个问题中与确认和个人确认有关的部分,因为它与主要问题无关,使我的问题过于复杂。

没有方法"开始";与Artemis核心CCD_ 18的交易。如果autoCommitSendsautoCommitAcksfalse,则一旦会话创建,则会话执行的任何发送或确认都将是事务的一部分,直到调用commit()rollback()为止。根据为autoCommitSendsautoCommitAcks设置的值,发送和确认可以是同一事务的一部分,也可以只是其中之一。

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

最新更新