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 }