参考网址
https://blog.csdn.net/weixin_44798288/article/details/125522934
https://www.guaosi.com/2022/04/17/simple-operation-rocketmq-by-golang/
下载安装开发包
go get 命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装。
整个过程就像安装一个 App 一样简单。
这个命令在内部实际上分成了两步操作:第一步是下载源码库包,第二步是执行go install安装。
所以我们执行如下命令进行下载安装,安装的过程如下图所示:
go get github.com/apache/rocketmq-client-go/v2

rocketmq客户端库包安装完成。后面我们才能使用rocketmq包提供的命令进行编码。
编写代码
package main
import (
"context"
"fmt"
"os"
"github.com/apache/rocketmq-client-go/v2"
"github.com/apache/rocketmq-client-go/v2/admin"
"github.com/apache/rocketmq-client-go/v2/consumer"
"github.com/apache/rocketmq-client-go/v2/primitive"
"github.com/apache/rocketmq-client-go/v2/producer"
)
func CreateTopic(topicName string) {
endPoint := []string{"192.168.120.78:9876"}
testAdmin, err := admin.NewAdmin(admin.WithResolver(primitive.NewPassthroughResolver(endPoint)))
if err != nil {
fmt.Printf("connection error: %s\n", err.Error())
}
err = testAdmin.CreateTopic(context.Background(),
admin.WithTopicCreate(topicName))
if err != nil {
fmt.Printf("createTopic error: %s\n", err.Error())
}
}
func SendSyncMessage(message string) {
endPoint := []string{"192.168.120.78:9876"}
p, _ := rocketmq.NewProducer(
producer.WithNameServer(endPoint),
producer.WithRetry(2),
producer.WithGroupName("ProducerGroupName"),
)
err := p.Start()
if err != nil {
fmt.Printf("start producer error: %s", err.Error())
os.Exit(1)
}
result, err := p.SendSync(context.Background(),
&primitive.Message{Topic: "testTopic01",
Body: []byte(message),
})
if err != nil {
fmt.Printf("send message error: %s\n", err.Error())
} else {
fmt.Printf("send message seccess: result=%s\n", result.String())
}
}
func SubcribeMessage() {
endPoint := []string{"192.168.120.78:9876"}
c, err := rocketmq.NewPushConsumer(consumer.WithNameServer(endPoint),
consumer.WithConsumerModel(consumer.Clustering),
consumer.WithGroupName("ConsumerGroupName"),
)
err = c.Subscribe("testTopic01", consumer.MessageSelector{}, func(ctx context.Context, msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) {
for i := range msgs {
fmt.Printf("subscribe callback : %v \n", msgs[i])
}
return consumer.ConsumeSuccess, nil
})
if err != nil {
fmt.Printf("subscribe message error: %s\n", err.Error())
}
err = c.Start()
if err != nil {
fmt.Printf("consumer start error: %s\n", err.Error())
os.Exit(-1)
}
err = c.Shutdown()
if err != nil {
fmt.Printf("shutdown Consumer error: %s\n", err.Error())
}
}
func main() {
CreateTopic("testTopic01")
SendSyncMessage("hello world2022send test ,rocketmq go client! too,是的")
SubcribeMessage()
}
生产者发送普通消息
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"
"os"
)
func main() {
p, err := rocketmq.NewProducer(
producer.WithNameServer([]string{"127.0.0.1:9876"}),
)
if err != nil {
panic(err)
}
err = p.Start()
defer func() {
err = p.Shutdown()
if err != nil {
fmt.Printf("shutdown producer error: %s", err.Error())
}
}()
if err != nil {
fmt.Printf("start producer error: %s", err.Error())
os.Exit(1)
}
msg := &primitive.Message{
Topic: "test",
Body: []byte("Hello RocketMQ Go Client!"),
}
res, err := p.SendSync(context.Background(), msg)
if err != nil {
panic(err)
}
fmt.Println("发送成功,result:", res.String()) }
消费者消费消息
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"
)
func main() {
c, err := rocketmq.NewPushConsumer(
consumer.WithGroupName("testGroup"),
consumer.WithNameServer([]string{"127.0.0.1:9876"}),
)
if err != nil {
panic(err)
}
err = c.Subscribe("test", consumer.MessageSelector{}, func(ctx context.Context,
msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) {
for _, msg := range msgs {
fmt.Printf("subscribe callback: %+v \n", msg)
}
return consumer.ConsumeSuccess, nil
})
if err != nil {
panic(err)
}
err = c.Start()
if err != nil {
panic(err)
}
defer func() {
err = c.Shutdown()
if err != nil {
fmt.Printf("shutdown Consumer error: %s", err.Error())
}
}()
<-(chan interface{})(nil)
}
生产者延迟发送消息
在有的场景中,需要生产者延迟发送msg到topic
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"
"os"
)
func main() {
p, err := rocketmq.NewProducer(
producer.WithNameServer([]string{"127.0.0.1:9876"}),
)
if err != nil {
panic(err)
}
err = p.Start()
defer func() {
err = p.Shutdown()
if err != nil {
fmt.Printf("shutdown producer error: %s", err.Error())
}
}()
if err != nil {
fmt.Printf("start producer error: %s", err.Error())
os.Exit(1)
}
msg := &primitive.Message{
Topic: "test",
Body: []byte("Hello RocketMQ Go Client!"),
}
msg.WithDelayTimeLevel(3)
res, err := p.SendSync(context.Background(), msg)
if err != nil {
panic(err)
}
fmt.Println("发送成功,result:", res.String())
}
生产者发送事务消息
package main
import (
"context"
"fmt"
"os"
"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 Listener struct{}
func (l *Listener) ExecuteLocalTransaction(message *primitive.Message) primitive.LocalTransactionState {
fmt.Println("开始执行本地业务逻辑入库")
time.Sleep(5 * time.Second)
fmt.Println("本地业务逻辑入库成功")
return primitive.UnknowState
}
func (l *Listener) CheckLocalTransaction(ext *primitive.MessageExt) primitive.LocalTransactionState {
fmt.Println("收到Rocketmq主动请求信息,msgID:", ext.MsgId)
return primitive.CommitMessageState
}
func main() {
l := Listener{}
p, err := rocketmq.NewTransactionProducer(
&l,
producer.WithNameServer([]string{"127.0.0.1:9876"}),
)
if err != nil {
panic(err)
}
err = p.Start()
defer func() {
err = p.Shutdown()
if err != nil {
fmt.Printf("shutdown producer error: %s", err.Error())
}
}()
if err != nil {
fmt.Printf("start producer error: %s", err.Error())
os.Exit(1)
}
msg := &primitive.Message{
Topic: "transTopic",
Body: []byte("Hello RocketMQ Go Client!"),
}
res, err := p.SendMessageInTransaction(context.Background(), msg)
if err != nil {
panic(err)
}
fmt.Printf("发送成功,data:%s,msgID:=%s\n", res.String(), res.MsgID)
<-(chan interface{})(nil)
}