rocketMQ5.0事务消息实战二

复制代码
func TRANSACTIONTopic() {
	// log to console
	os.Setenv("mq.consoleAppender.enabled", "true")
	golang.ResetLogger()
	topic := "TRANSACTIONTopic"

	producer, err := golang.NewProducer(&golang.Config{
		Endpoint:    Endpoint,
		Credentials: &credentials.SessionCredentials{},
	},
		golang.WithTransactionChecker(&golang.TransactionChecker{
			Check: CheckHalf, //检查half消息
		}),
		golang.WithTopics(topic),
	)
	if err != nil {
		log.Fatal(err)
	}
	// start producer
	err = producer.Start()
	if err != nil {
		log.Fatal(err)
	}
	// graceful stop producer
	defer producer.GracefulStop()
	msg := &golang.Message{Topic: topic, Body: []byte("this is a message TRANSACTION ")}
	msg.SetKeys("a", "b")
	msg.SetTag("ab")
	transaction := producer.BeginTransaction()
	resp, err := producer.SendWithTransaction(context.TODO(), msg, transaction)
	if err != nil {
		log.Fatal(err)
	}
	for i := 0; i < len(resp); i++ {
		fmt.Printf("%#v\n", resp[i])
	}
	//commit transaction message
	//TODO 本地事务执行成功
	TODOLocalTransaction()
	//提交事务
	err = transaction.Commit()
	if err != nil {
		log.Fatal(err)
	}

	time.Sleep(time.Minute * 10)
}

// 检查本地事务
func CheckHalf(msg *golang.MessageView) golang.TransactionResolution {
	log.Printf("check transaction message: %v", msg)
	CheckLocalTransaction() //检查本地事务
	return golang.COMMIT
}
func TODOLocalTransaction() bool {
	return true
}
func CheckLocalTransaction() bool {
	return true
}
第一步:producer.SendWithTransaction 发送半事务(发送成功)

第二步:TODO 本地事务执行成功 TODOLocalTransaction(执行本地事务成功)

第三步:当我们注释掉第三步commit代码,模拟提交事务异常(模拟commit事务消息失败)

第四步:rocketmq触发CheckHalf代码

check事务状态类型

复制代码
UNKNOWN  // 暂时无法判断状态,等待固定时间以后Broker端根据回查规则向生产者进行消息回查
COMMIT   //提交事务,允许消费者消费该消息
ROLLBACK //回滚事务,消息将被丢弃不允许消费。

2-3检查half检查本地事务成功,commit事务

半事务触发时间限制

相关推荐
滕州市燕猫虎计算机科技工作室个体工商户2 小时前
Java,Java NIO,Java NIO2,Java AIO,AsynchronousServerSocketChannel
java·开发语言·nio·aio·nio2
古城小栈3 小时前
Rust 学习路线,供初学者参考
开发语言·rust
喵了几个咪3 小时前
GoWind CMS 拆解:给 NL2SQL 上四把锁——智能问数的安全边界
开发语言·后端·安全·微服务·golang·gowind
多弗朗皮卡丘3 小时前
C++的类型转换
开发语言·c++
FLJwu3 小时前
运动相机图像传感器选型实战|第二篇:参数看着一模一样,为什么骑行录像疯狂果冻、拖影翻车?
android·c语言·开发语言·数码相机·运动相机·oem 量产
驭渊的小故事3 小时前
从 JVM 底层看泛型:泛型擦除、Signature 属性与 Super Type Token 模式
java·开发语言·jvm
Escalating_xu3 小时前
【C语言项目实战】贪吃蛇(下):移动、碰撞与计分,完成一局可玩的游戏
c语言·开发语言·游戏
qq_401700414 小时前
Qt Modbus 源码剖析:从 QModbusClient 到工业级通信框架
开发语言·qt·系统架构
星夜离尘564 小时前
MATLAB 角度解缠遇到丢样:先分段,再说明圈数为什么不可恢复
开发语言·matlab
我命由我123454 小时前
6-2.Python 异常处理 - 异常捕获(捕获指定异常、常见异常类型、异常信息)
java·运维·开发语言·python·http·https·java-ee