我在文档中找不到足够的关于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
回滚所有已确认(在此会话中(和未提交的消息。
我的结论正确吗?
===EDIT===
我删除了这个问题中与确认和个人确认有关的部分,因为它与主要问题无关,使我的问题过于复杂。
没有方法"开始";与Artemis核心CCD_ 18的交易。如果autoCommitSends
或autoCommitAcks
是false
,则一旦会话创建,则会话执行的任何发送或确认都将是事务的一部分,直到调用commit()
或rollback()
为止。根据为autoCommitSends
和autoCommitAcks
设置的值,发送和确认可以是同一事务的一部分,也可以只是其中之一。
如果send或acks的autoCommit为true
,则调用commit()
或rollback()
不会对相应的操作产生任何功能性影响。但是,客户端仍然会向代理发送命令,并等待代理的响应。除非确实有必要,否则客户端有责任不调用这些操作。