65 lines
1.8 KiB
Go
65 lines
1.8 KiB
Go
|
|
package mqproducer
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"context"
|
|||
|
|
"encoding/json"
|
|||
|
|
"github.com/apache/rocketmq-client-go/v2"
|
|||
|
|
"github.com/apache/rocketmq-client-go/v2/primitive"
|
|||
|
|
"github.com/apache/rocketmq-client-go/v2/producer"
|
|||
|
|
"log"
|
|||
|
|
"sync"
|
|||
|
|
"toutoukan/model/usermodel/userOrder"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
var normalProducer rocketmq.Producer
|
|||
|
|
var producerInitOnce sync.Once // 用于保证生产者只初始化一次
|
|||
|
|
|
|||
|
|
// 发送普通消息
|
|||
|
|
func SendNormalMessage(OrderId string, GoodsID string, UserID int) error {
|
|||
|
|
var initErr error
|
|||
|
|
// 使用 sync.Once 保证生产者只初始化一次
|
|||
|
|
producerInitOnce.Do(func() {
|
|||
|
|
normalProducer, initErr = rocketmq.NewProducer(
|
|||
|
|
producer.WithNameServer([]string{"127.0.0.1:9876"}), // RocketMQ namesrv 地址
|
|||
|
|
producer.WithGroupName("order_producer_group"), // 生产者组名
|
|||
|
|
)
|
|||
|
|
if initErr != nil {
|
|||
|
|
log.Fatalf("初始化普通生产者失败: %v", initErr)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if initErr = normalProducer.Start(); initErr != nil {
|
|||
|
|
log.Fatalf("启动普通生产者失败: %v", initErr)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
// 若初始化过程有错误,直接返回
|
|||
|
|
if initErr != nil {
|
|||
|
|
log.Printf("生产者初始化失败: %v", initErr)
|
|||
|
|
return initErr
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 构造消息内容
|
|||
|
|
msgData := userOrder.OrderMessage{
|
|||
|
|
OrderID: OrderId,
|
|||
|
|
GoodsID: GoodsID,
|
|||
|
|
UserID: UserID,
|
|||
|
|
Quantity: 1,
|
|||
|
|
}
|
|||
|
|
msgBody, _ := json.Marshal(msgData)
|
|||
|
|
|
|||
|
|
// 创建消息(指定主题和内容)
|
|||
|
|
msg := primitive.NewMessage("killgoods", msgBody) // 主题需提前创建或开启自动创建
|
|||
|
|
|
|||
|
|
// 发送消息(同步发送,等待结果)
|
|||
|
|
result, err := normalProducer.SendSync(context.Background(), msg)
|
|||
|
|
if err != nil {
|
|||
|
|
log.Printf("普通消息发送失败: %v", err)
|
|||
|
|
return err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
log.Printf("普通消息发送成功,消息ID: %s, 队列: %d, 偏移量: %d",
|
|||
|
|
result.MsgID, result.MessageQueue.QueueId, result.QueueOffset)
|
|||
|
|
return nil
|
|||
|
|
}
|