2026-07-13 21:28:41 +08:00

56 lines
1.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package integration
import (
"context"
"errors"
"strings"
luckygifteventsv1 "hyapp.local/api/proto/events/luckygift/v1"
"hyapp/pkg/luckygiftmq"
"hyapp/pkg/rocketmqx"
)
// RocketMQEventPublisher 把已经完成钱包入账的幸运礼物事实发布到 owner topic。
// 它不读取 outbox 表claim、重试和 delivered 状态仍由 lucky-gift-service 的 settlement worker 独占。
type RocketMQEventPublisher struct {
producer *rocketmqx.Producer
topic string
}
func NewRocketMQEventPublisher(producer *rocketmqx.Producer, topic string) *RocketMQEventPublisher {
return &RocketMQEventPublisher{producer: producer, topic: strings.TrimSpace(topic)}
}
// PublishLuckyGiftEvent 只有在 Broker ACK 后返回成功worker 随后才能把 owner outbox 标为 delivered。
func (p *RocketMQEventPublisher) PublishLuckyGiftEvent(ctx context.Context, envelope *luckygifteventsv1.EventEnvelope) error {
if p == nil || p.producer == nil {
return errors.New("lucky gift RocketMQ producer is not configured")
}
message, err := luckyGiftRocketMessage(p.topic, envelope)
if err != nil {
return err
}
return p.producer.SendSync(ctx, message)
}
func luckyGiftRocketMessage(topic string, envelope *luckygifteventsv1.EventEnvelope) (rocketmqx.Message, error) {
topic = strings.TrimSpace(topic)
if topic == "" {
return rocketmqx.Message{}, errors.New("lucky gift outbox topic is required")
}
body, err := luckygiftmq.EncodeLuckyGiftOutboxMessage(envelope)
if err != nil {
return rocketmqx.Message{}, err
}
tag, err := luckygiftmq.EventTypeTag(envelope.GetEventType())
if err != nil {
return rocketmqx.Message{}, err
}
return rocketmqx.Message{
Topic: topic,
Tag: tag,
Keys: []string{envelope.GetEventId(), envelope.GetDrawId()},
Body: body,
}, nil
}