国内网上没有找到资料, 翻阅了其他资料整理的
producer.go
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"
"github.com/apache/rocketmq-client-go/v2/rlog"
"log"
"mq/mq/config"
"os"
"strconv"
)
func main() {
rlog.SetLogLevel("warn") // error warn
p, err := rocketmq.NewProducer(
producer.WithNameServer(config.C.NameSrvAddr),
producer.WithRetry(2), // 重试次数
producer.WithQueueSelector(producer.NewHashQueueSelector()), // 表明使用要发送的队列就是msg中定义的queue
)
if err != nil {
fmt.Printf("NewProducer error: %s\n", err.Error())
os.Exit(1)
}
err = p.Start()
if err != nil {
fmt.Printf("start producer error: %s\n", err.Error())
os.Exit(1)
}
// 能保证同一orderId下的消息是顺序的
for i := 0; i < 3; i++ {
orderId := strconv.Itoa(i)
for j := 1; j < 5; j++ {
msg := &primitive.Message{
Topic: config.C.Topic,
Body: []byte("订单: " + orderId + " 步骤: " + strconv.Itoa(j)),
}
msg.WithShardingKey(orderId) // *关键 用于分片
_, err = p.SendSync(context.Background(), msg) // 不能用单向
if err != nil {
log.Printf("send message err: %s", err)
continue
}
}
}
log.Println("发布任务")
}
consume.go
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"
"github.com/apache/rocketmq-client-go/v2/rlog"
"log"
"mq/mq/config"
"strconv"
)
func main() {
rlog.SetLogLevel("error") // warn error
c, _ := rocketmq.NewPushConsumer(
consumer.WithNameServer(config.C.NameSrvAddr),
consumer.WithGroupName(config.C.GroupName), // 分组
consumer.WithConsumerModel(consumer.Clustering), // 一条消息在一个组中只有一个consumer消费
consumer.WithConsumerOrder(true), // *顺序接收 必须
)
// defer c.Shutdown()
err := c.Subscribe(config.C.Topic, consumer.MessageSelector{},
func(ctx context.Context, msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) {
for _, m := range msgs {
log.Printf("%s Body: %s", getBlank(m.GetShardingKey()), m.Body)
}
return consumer.ConsumeSuccess, nil
})
if err != nil {
fmt.Println("读取消息失败")
}
_ = c.Start()
fmt.Println("开始读取消息 queue")
select {}
}
func getBlank(s string) (rs string) {
n, _ := strconv.Atoi(s)
for i := 0; i < n; i++ {
rs += ` `
}
return
}