求问为何Rocketmq有个 事务消息的功能, 按照官方的例子 unknown消息 却没能触发listener的 checkLocalTransaction方法

杭州丹尼 2020-12-17 09:23:04
Rocketmq有个 事务消息的功能, 按照官方的例子 unknown消息 却没能触发listener的 checkLocalTransaction方法
使用的版本从4.4 4.5 都试了 ,未能奏效 ,

用的是官方的example里面的 transaction包里的例子:




public class TransactionProducer {
public static void main(String[] args) throws MQClientException, InterruptedException {
TransactionListener transactionListener = new TransactionListenerImpl();
TransactionMQProducer producer = new TransactionMQProducer("MyTopic");
ExecutorService executorService = new ThreadPoolExecutor(2, 5, 100, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(2000), new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setName("client-transaction-msg-check-thread");
return thread;
}
});
producer.setNamesrvAddr("127.0.0.1:9876");
producer.setExecutorService(executorService);
producer.setTransactionListener(transactionListener);
producer.start();

// String[] tags = new String[] {"TagA", "TagB", "TagC", "TagD", "TagE"};

String[] tags = new String[] {"TagA"};
for (int i = 0; i < 1; i++) {
try {
Message msg =
new Message("TopicTest1234", tags[i % tags.length], "KEY" + i,
("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
SendResult sendResult = producer.sendMessageInTransaction(msg, null);
System.out.printf("%s%n", sendResult);

Thread.sleep(10);
} catch (MQClientException | UnsupportedEncodingException e) {
e.printStackTrace();
}
}

for (int i = 0; i < 100000; i++) {
Thread.sleep(1000);
}
producer.shutdown();
}
}



public class TransactionListenerImpl implements TransactionListener {
private AtomicInteger transactionIndex = new AtomicInteger(0);

private ConcurrentHashMap<String, Integer> localTrans = new ConcurrentHashMap<>();

@Override
public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
int value = transactionIndex.getAndIncrement();
int status = value % 3;
localTrans.put(msg.getTransactionId(), status);
return LocalTransactionState.UNKNOW;
}

@Override
public LocalTransactionState checkLocalTransaction(MessageExt msg) {
System.out.println("========================== 回查 msg " + msg.getMsgId() + "=====================");
Integer status = localTrans.get(msg.getTransactionId());
if (null != status) {
switch (status) {
case 0:
return LocalTransactionState.UNKNOW;
case 1:
return LocalTransactionState.COMMIT_MESSAGE;
case 2:
return LocalTransactionState.ROLLBACK_MESSAGE;
default:
return LocalTransactionState.COMMIT_MESSAGE;
}
}
return LocalTransactionState.COMMIT_MESSAGE;
}
}







启动这个TransactionProducer , 他会发一条消息, 在listener中故意 在executeLocalTransaction() 方法里
return LocalTransactionState.UNKNOW;
但是一直等checkLocalTransaction() 重查 状态方法的调用,却一直未进入此方法 , 那这个重查机制就没能见识到,
有高手能释疑下吗
...全文
14788 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
胖七叔 2023-08-10
  • 打赏
  • 举报
回复 1

你只有把状态置为UNKNOWN,才会走checkLocalTransaction(Message message)方法啊,因为如果是ROLLBACK你自己都已经给将事务回滚了

m0_49177947 2022-09-19
  • 打赏
  • 举报
回复

你好,我用的是4.4.0版本,也无法触发checkLocalTransaction()方法执行,请问楼主有找到解决方案吗

HFRayAllen 2022-08-18
  • 打赏
  • 举报
回复

你好,我也遇到了这个问题,checkLocalTransaction方法不会被执行,返回是UNKNOWN的消息仍然被消费者拿去消费了,请问你是怎么解决的

XDY777. 2022-08-09
  • 打赏
  • 举报
回复 3

把那个producer.shutdown();删了,你那个还没等到它来调用回查,你的Producer已经shutdown了调也调不到了!

weixin_39031345 2021-08-11
  • 打赏
  • 举报
回复

我用的是4.9.0,executeLocalTransaction()中返回的是RocketMQLocalTransactionState.UNKNOWN,然后过了27秒checkLocalTransaction()被调起

飞花一叶 2021-07-12
  • 打赏
  • 举报
回复

4.4.0版本可以,另外消息发送出去后,回查测试默认配置有60秒左右的延迟,如果你不发确认消息的话

kusedexingfu 2021-05-13
  • 打赏
  • 举报
回复
我也是,不知道啥原因。。。
  • 打赏
  • 举报
回复
executeLocalTransaction() 方法返回设置为 LocalTransactionState.COMMIT_MESSAGE,开源版的 RocketMQ checkLocalTransaction() 方法阉割了,不会执行。阿里巴巴是真他妈的恶心。。。
乃刀的青春 2021-03-25
  • 打赏
  • 举报
回复
我拿最新版本的rocketmq,也是没有调用回查接口,不知道什么鬼?
自行车在路上 2021-01-13
  • 打赏
  • 举报
回复
我也遇到这个问题~怎么解决?
小白小白小 2020-12-29
  • 打赏
  • 举报
回复
引用 6 楼 qq_50250656 的回复:
引用 5 楼 小白小白小 的回复:
引用 4 楼 qq_50250656 的回复:
引用 3 楼 小白小白小 的回复:
刚好我也在看,直接找不到TransactionListenerImpl这方法,用不了
TransactionListenerImpl是自己创建的类,你应该去实现TransactionListener
嗯嗯,已经本地跑起来了
checkLocalTransaction() 这个方法你可以触发吗?
那个要本地执行时很久没响应才会执行回查的
小白小白小 2020-12-28
  • 打赏
  • 举报
回复
引用 6 楼 qq_50250656 的回复:
引用 5 楼 小白小白小 的回复:
引用 4 楼 qq_50250656 的回复:
引用 3 楼 小白小白小 的回复:
刚好我也在看,直接找不到TransactionListenerImpl这方法,用不了
TransactionListenerImpl是自己创建的类,你应该去实现TransactionListener
嗯嗯,已经本地跑起来了
checkLocalTransaction() 这个方法你可以触发吗?
没有,这方法也会执行的吗,我以为要本地确认才会执行之类的
qq_50250656 2020-12-28
  • 打赏
  • 举报
回复
引用 5 楼 小白小白小 的回复:
引用 4 楼 qq_50250656 的回复:
引用 3 楼 小白小白小 的回复:
刚好我也在看,直接找不到TransactionListenerImpl这方法,用不了
TransactionListenerImpl是自己创建的类,你应该去实现TransactionListener
嗯嗯,已经本地跑起来了
checkLocalTransaction() 这个方法你可以触发吗?
小白小白小 2020-12-28
  • 打赏
  • 举报
回复
引用 4 楼 qq_50250656 的回复:
引用 3 楼 小白小白小 的回复:
刚好我也在看,直接找不到TransactionListenerImpl这方法,用不了
TransactionListenerImpl是自己创建的类,你应该去实现TransactionListener
嗯嗯,已经本地跑起来了
qq_50250656 2020-12-28
  • 打赏
  • 举报
回复
引用 3 楼 小白小白小 的回复:
刚好我也在看,直接找不到TransactionListenerImpl这方法,用不了
TransactionListenerImpl是自己创建的类,你应该去实现TransactionListener
小白小白小 2020-12-24
  • 打赏
  • 举报
回复
刚好我也在看,直接找不到TransactionListenerImpl这方法,用不了
杭州丹尼 2020-12-18
  • 打赏
  • 举报
回复
好不容易觉得这个机制不错 ,结果跑不出来效果, 真闹心
maradona1984 2020-12-18
  • 打赏
  • 举报
回复
我这4.4版本是支持的

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧