go简单实现rocketmq
2023-12-25 12:17:08
go实现rocketmq
关闭防火墙
发送普通消息
发送普通消息
package main
import (
"context"
"fmt"
"github.com/apache/rocketmq-client-go/v2"
"github.com/apache/rocketmq-client-go/v2/primitive"
"github.com/apache/rocketmq-client-go/v2/producer"
)
// 发送普通消息
func main() {
//消息的发送者 注册中心
p, err := rocketmq.NewProducer(producer.WithNameServer([]string{"192.168.0.102:9876"}))
if err != nil {
panic("生成发送者失败")
}
if err = p.Start(); err != nil {
panic("启动发送者失败")
} //启动
//同步发送消息
res, err := p.SendSync(context.Background(), primitive.NewMessage("chengpeng1", []byte("this is chengpeng1")))
if err != nil {
fmt.Printf("发送失败: %s\n", err)
} else {
fmt.Printf("发送成功: %s\n", res.String())
}
//关闭消息
if err = p.Shutdown(); err != nil {
panic("关闭发送者失败")
}
}
2. 消费消息
package main
import (
"context"
"fmt"
"github.com/apache/rocketmq-client-go/v2"
"github.com/apache/rocketmq-client-go/v2/consumer"
"github.com/apache/rocketmq-client-go/v2/primitive"
"time"
)
func main() {
//创建消费者 pull会不停轮询就会浪费资源 异步编程
res, err := rocketmq.NewPushConsumer(consumer.WithNameServer([]string{"192.168.0.102:9876"}), //NameService
consumer.WithGroupName("chengpeng")) 消费者组 只要groupname一致 可能有多个实例
if err != nil {
fmt.Println("消费者实例创建失败", err)
}
//订阅 topic consumer.MessageSelector{} ==>消息选择器
err = res.Subscribe("chengpeng1", consumer.MessageSelector{}, func(ctx context.Context, msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) {
for _, msg := range msgs {
fmt.Printf("获取到值: %v \n", msg)
}
return consumer.ConsumeSuccess, nil
})
if err != nil {
fmt.Println("读取消息失败", err)
}
err = res.Start()
if err != nil {
fmt.Println("启动消息失败", err)
return
}
//不能让主协程退出
time.Sleep(time.Hour)
err = res.Shutdown()
if err != nil {
fmt.Println("停止消息失败", err)
return
}
}
consumer.MessageSelector{}==>这个只能这样使用吗?传的参数没用吗
发送延时消息
延迟消息
package main
import (
"context"
"fmt"
"github.com/apache/rocketmq-client-go/v2"
"github.com/apache/rocketmq-client-go/v2/primitive"
"github.com/apache/rocketmq-client-go/v2/producer"
)
// 发送延迟消息
func main() {
//消息的发送者 注册中心
p, err := rocketmq.NewProducer(producer.WithNameServer([]string{"192.168.0.102:9876"}))
if err != nil {
panic("生成发送者失败")
}
if err = p.Start(); err != nil {
panic("启动发送者失败")
} //启动
msg := primitive.NewMessage("chengpeng1", []byte("this is deilay messgae"))
msg.WithDelayTimeLevel(3) //设置延迟级别
//同步发送消息
res, err := p.SendSync(context.Background(), msg)
if err != nil {
fmt.Printf("发送失败: %s\n", err)
} else {
fmt.Printf("发送成功: %s\n", res.String())
}
//关闭消息
if err = p.Shutdown(); err != nil {
panic("关闭发送者失败")
}
}
//支付的时候, 淘宝, 12306, 购票, 超时归还 - 定时执行逻辑 //我可以去写一个轮询, 轮询的问题: 1.多久执行一次轮询 30分钟 在12:00执行过一次, 下一次执行就是在 12:30的时候但是12:01的时候下了单->一一直没有支付, 12:30还没有超时,12:31就应该超时 13:00时候才能超时 那我1分钟执行一次啊,
比如我的订单量没有这么大,1分钟执行一次, 其中29次查询都是无用, 而且你还还会轮询mysql //rocketmq的延迟消息, 1.时间一到就执行, 2. 消息中包含了订单编号,你只查询这种订单编号
4. 发送事务消息
package main
import (
"context"
"fmt"
"time"
"github.com/apache/rocketmq-client-go/v2"
"github.com/apache/rocketmq-client-go/v2/primitive"
"github.com/apache/rocketmq-client-go/v2/producer"
)
type OrderListener struct{}
// ExecuteLocalTransaction 执行本地事务
// primitive.CommitMessageState : 提交
// primitive.RollbackMessageState : 回滚
// primitive.UnknowState : 触发会查函数 CheckLocalTransaction
func (o *OrderListener) ExecuteLocalTransaction(msg *primitive.Message) primitive.LocalTransactionState {
fmt.Println("开始执行本地逻辑")
time.Sleep(time.Second * 3)
fmt.Println("执行本地逻辑失败")
//本地执行逻辑无缘无故失败 代码异常 宕机
return primitive.UnknowState
}
// CheckLocalTransaction 回查函数
// primitive.CommitMessageState : 提交
// primitive.RollbackMessageState : 回滚
// primitive.UnknowState : 触发会查函数 CheckLocalTransaction
func (o *OrderListener) CheckLocalTransaction(msg *primitive.MessageExt) primitive.LocalTransactionState {
fmt.Println("rocketmq的消息回查")
time.Sleep(time.Second * 15)
return primitive.CommitMessageState
}
func main() {
p, err := rocketmq.NewTransactionProducer(
&OrderListener{},
producer.WithNameServer([]string{"192.168.0.104:9876"}),
)
if err != nil {
panic("生成producer失败")
}
if err = p.Start(); err != nil {
panic("启动producer失败")
}
res, err := p.SendMessageInTransaction(context.Background(), primitive.NewMessage("TransTopic", []byte("this is transaction message2")))
if err != nil {
fmt.Printf("发送失败: %s\n", err)
} else {
fmt.Printf("发送成功: %s\n", res.String())
}
time.Sleep(time.Hour)
if err = p.Shutdown(); err != nil {
panic("关闭producer失败")
}
}
文章来源:https://blog.csdn.net/qq_40432598/article/details/135190091
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!