如何解决交易如何与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中的交易到底是什么。可以落实或回滚哪些操作?
我已经测试了几种情况,并得出了结论。 Thera是可以提交或回滚的两个操作:消息发送和消息接收(确认)。方法ClientSession#commit
和ClientSession#rollback
仅用于提交和回滚消息的发送和确认。无需任何方法即可开始交易。只有未提交的消息可以提交或回滚。在会话创建期间可以使用的两个参数 autoCommitSends 和 autoCommitAcks 对于artemis交易至关重要。
让我们考虑消息发送。
如果 autoCommitSends 设置为true,则ClientSession#commit
和ClientSession#rollback
不执行任何操作。
如果 autoCommitSends 设置为false,则必须在发送消息(ClientSession#commit
)之后调用ClientProducer#send
方法才能真正发送消息。方法ClientSession#commit
提交所有已发送(在此会话中)和未提交的消息。可以通过调用ClientSession#rollback
方法来回滚消息。方法ClientSession#rollback
回滚所有已发送的消息(在此会话中)和未提交的消息。
让我们考虑接收消息。
如果 autoCommitAcks 设置为true,则ClientSession#commit
和ClientSession#rollback
不执行任何操作。
如果 autoCommitAcks 设置为false,则必须在消息确认(ClientSession#commit
)之后调用ClientMessage#acknowledge
方法才能真正确认消息。方法ClientSession#commit
提交所有已确认的消息(在此会话中)和未提交的消息。可以通过调用ClientSession#rollback
方法来回滚消息确认。方法ClientSession#rollback
回滚所有已确认(在此会话中)和未提交的消息。
我的结论正确吗?
=== EDIT ===
我删除了该问题中与确认和个人确认有关的部分,因为它与主要问题无关,并且使我的问题过于复杂。
解决方法
没有方法可以通过Artemis核心ClientSession
“启动”交易。如果autoCommitSends
或autoCommitAcks
为false
,则会话创建后会话执行的任何发送或确认将一直是事务的一部分,直到commit()
或rollback()
叫做。根据为autoCommitSends
和autoCommitAcks
设置的值,两者发送和确认可以是同一笔交易的一部分,也可以是另一笔交易。
如果发送或确认的autoCommit为true
,则调用commit()
或rollback()
不会对相应操作产生任何 functional 影响。但是,客户端仍将命令发送给代理,并等待代理的响应。除非确实有必要,否则客户有责任不调用这些操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。