类似 jdbcTranscationManager 的接口 commit()、rollback() 等,目前实现事务需要实现 TransactionListener ,然后需要把本地事务代码写入 executeLocalTransaction, rocketMQ 在发送完半消息后会自动调取,但这个设计的侵入性是否太强? 假设,消息的发起者需要本地事务的返回值时应该怎么处理?
Q
[apache/rocketmq]询问是否支持手动提交事务消息?
5
A
回答
5
呃,感觉我提交错了仓库?是不是应该提交到 alibaba/spring-cloud-alibaba
3
如果您需要获取本地事务的返回值,可以将本地事务的判断逻辑抽象成一个公共方法,这样应该可以解决您的问题。`executeLocalTransaction` 方法会在事务消息发送后自动调用,可以更好地配合事务消息回溯机制的使用。
1
@oni7uka 我比较赞同你的想法,最近社区也在推动进行API的优化,从事务消息来说,综合考虑当前的设计,个人觉得更好的做法是: final Transaction transaction = producer.prepare(msg); executeLocalTransaction() transaction.commit();//rollback();
欢迎提出更多的建议,但是实际上API 的优化总是会那么难,所以我们可以在邮件列表里面发起一个讨论:https://rocketmq.apache.org/about/contact/
5
事务API确实需要和传统习惯靠拢,建议邮件dev里面提交讨论
5
当前设计的问题是把『事务执行逻辑』和『事务回查逻辑』耦合在一个Listener里面了,导致正常逻辑的事务代码写法看起来有点别扭。
可以考虑把 executeLocalTransaction 从Listener里面去掉,但需要保留checkLocalTransaction。
另外一方面,后续引入Batch之后,可以考虑支持一批消息的事务,用唯一TransactionId来进行标识。