前言
提示:rocketmq安装
一、golang引用rocket-client
go get github.com/apache/rocketmq-client-go/v2
二、发送简单消息
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() {
var host = "127.0.0.1" //修改为自己的ip地址
var port = 9876
p, err := rocketmq.NewProducer(producer.WithNameServer([]string{fmt.Sprintf("%s:%d", host, port)}))
if err != nil {
panic(err)
}
err = p.Start()
defer p.Shutdown()
if err != nil {
panic(err)
}
res, err := p.SendSync(context.Background(), &primitive.Message{
Topic: "my_test_topic",
Body: []byte("Hello RocketMQ!"),
})
if err != nil {
panic(err)
} else {
fmt.Println(res.String())
}
}
发送成功
三、接收消息
package main
import (
"context"
"fmt"
"time"
"github.com/apache/rocketmq-client-go/v2"
"github.com/apache/rocketmq-client-go/v2/consumer"
"github.com/apache/rocketmq-client-go/v2/primitive"
)
func main() {
var host = "127.0.0.1" //修改为自己的ip
var port = 9876
c, _ := rocketmq.NewPushConsumer(
consumer.WithNameServer([]string{fmt.Sprintf("%s:%d", host, port)}),
consumer.WithGroupName("my_test_group"),
)
err := c.Subscribe("my_test_topic",
consumer.MessageSelector{},
func(ctx context.Context, msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) {
for _, msg := range msgs {
fmt.Printf("获取到的值为: %s\n", msg.Body)
}
return consumer.ConsumeSuccess, nil
},
)
if err != nil {
fmt.Println(err)
return
}
_ = c.Start()
defer c.Shutdown()
time.Sleep(10 * time.Second) //阻塞10s 等待消费 可以修改阻塞时间,下边的发送也可以使用这个接收
}
四、发送其他消息
4.1 延时消息
延时队列的级别
1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
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() {
var host = "127.0.0.1"
var port = 9876
p, err := rocketmq.NewProducer(producer.WithNameServer([]string{fmt.Sprintf("%s:%d", host, port)}))
if err != nil {
panic(err)
}
err = p.Start()
defer p.Shutdown()
if err != nil {
panic(err)
}
var msg = &primitive.Message{
Topic: "my_test_topic",
Body: []byte("Hello RocketMQ 延时消息!"),
}
msg.WithDelayTimeLevel(2) // level = 2 这里是5s
res, err := p.SendSync(context.Background(),msg)
if err != nil {
panic(err)
} else {
fmt.Println(res.String())
}
}
4.2 事务消息
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{}
func (o *OrderListener) ExecuteLocalTransaction(addr *primitive.Message) primitive.LocalTransactionState {
// TODO: 执行代码逻辑
fmt.Println("执行本地事务")
time.Sleep(time.Second * 5) //这里可以修改阻塞时长,这里可以验证 事务检查功能,如果长时间没有返回,则会执行事务检查功能
fmt.Println("本地事务执行完毕")
// TODO: 发送half消息 到消息队列
return primitive.CommitMessageState
/**
事务取消
return primitive.RollbackMessageState
*/
}
/*
*
事务检查
*/
func (o *OrderListener) CheckLocalTransaction(msg *primitive.MessageExt) primitive.LocalTransactionState {
fmt.Println("检查本地事务")
return primitive.RollbackMessageState
}
func main() {
var host = "127.0.0.1"
var port = 9876
p, err := rocketmq.NewTransactionProducer(
&OrderListener{},
producer.WithNameServer([]string{fmt.Sprintf("%s:%d", host, port)}),
)
if err != nil {
fmt.Println(err)
return
}
p.Start()
defer p.Shutdown()
res, err := p.SendMessageInTransaction(context.Background(), primitive.NewMessage("my-transaction-topic", []byte("这是一个事务消息")))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(res.String())
time.Sleep(time.Hour * 1) // 阻塞等待事务执行完毕
}
总结
感谢观看,加油