我在文档中找不到关于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===
我删除了这个问题的一部分有关确认和individualAcknowledge,因为它是无关的主要问题,并使我的问题太复杂。
发布于 2020-11-11 16:19:17
没有使用Artemis核心ClientSession“启动”事务的方法。如果autoCommitSends或autoCommitAcks是false,那么会话创建后执行的任何发送或ack都将成为事务的一部分,直到调用commit()或rollback()为止。根据为autoCommitSends和autoCommitAcks设置的值,发送和添加都可以是同一个事务的一部分,也可以是一个或另一个事务的一部分。
如果autoCommit是true,那么调用commit()或rollback()不会对相应的操作产生任何功能影响。但是,客户端仍将向代理发送命令,并等待代理的响应。客户端有责任不调用这些操作,除非它是必要的。
https://stackoverflow.com/questions/64717899
复制相似问题