orderNotice定时任务
This commit is contained in:
parent
4f9caac1b0
commit
457381a85c
|
|
@ -14,7 +14,7 @@ import (
|
||||||
|
|
||||||
func (v *Cmb) Notify(ctx context.Context, order *bo.OrderBo) (*bo.OrderNotifyBo, error) {
|
func (v *Cmb) Notify(ctx context.Context, order *bo.OrderBo) (*bo.OrderNotifyBo, error) {
|
||||||
|
|
||||||
if order.Status.IsCanNotify() {
|
if !order.Status.IsCanNotify() {
|
||||||
return nil, fmt.Errorf("订单状态不允许通知,orderNo:%s,orderStatusText:%s", order.OrderNo, order.Status.GetText())
|
return nil, fmt.Errorf("订单状态不允许通知,orderNo:%s,orderStatusText:%s", order.OrderNo, order.Status.GetText())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,35 @@ func Test_WechatNotifyProducer2(t *testing.T) {
|
||||||
|
|
||||||
tag := "voucher_notify_dev"
|
tag := "voucher_notify_dev"
|
||||||
|
|
||||||
|
bodyStr := `{"id":"5465699d-de6a-5414-a8df-283167b577ca",
|
||||||
|
"create_time":"2025-03-07T15:57:24+08:00",
|
||||||
|
"resource_type":"encrypt-resource",
|
||||||
|
"event_type":"COUPON.USE",
|
||||||
|
"summary":"代金券核销通知",
|
||||||
|
"original_type":"coupon",
|
||||||
|
"associated_data":"coupon",
|
||||||
|
"plain_text":{
|
||||||
|
"stock_creator_mchid":"1652465541",
|
||||||
|
"stock_id":"20259610",
|
||||||
|
"coupon_id":"97225743207",
|
||||||
|
"coupon_name":"test",
|
||||||
|
"description":"","status":"USED",
|
||||||
|
"create_time":"2025-03-07T15:49:31+08:00",
|
||||||
|
"coupon_type":"NORMAL",
|
||||||
|
"no_cash":false,
|
||||||
|
"singleitem":false,
|
||||||
|
"consume_information":{"consume_time":"2025-03-07T15:57:24+08:00","consume_mchid":"1800002761","transaction_id":"4200002544202503077103159055"}}}`
|
||||||
|
|
||||||
|
if err := wechatNotifyProducer(tag, bodyStr); err != nil {
|
||||||
|
t.Errorf("入队失败 error = %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_WechatNotifyProducer3(t *testing.T) {
|
||||||
|
|
||||||
|
tag := "voucher_notify_dev"
|
||||||
|
|
||||||
bodyStr := `{"id":"8804b1d0-74e8-5975-815d-e567a761a213","create_time":"2025-03-18T09:20:50+08:00","resource_type":"encrypt-resource","event_type":"COUPON.USE","summary":"代金券核销通知","original_type":"coupon","associated_data":"coupon","plain_text":{"stock_creator_mchid":"1652465541","stock_id":"20255099","coupon_id":"97046583699","coupon_name":"招行测试滚动有效期","description":"","status":"USED","create_time":"2025-03-17T19:38:52+08:00","coupon_type":"NORMAL","no_cash":false,"singleitem":false,"consume_information":{"consume_time":"2025-03-18T09:20:50+08:00","consume_mchid":"1532524971","transaction_id":"4200002702202503180978933760"}}}`
|
bodyStr := `{"id":"8804b1d0-74e8-5975-815d-e567a761a213","create_time":"2025-03-18T09:20:50+08:00","resource_type":"encrypt-resource","event_type":"COUPON.USE","summary":"代金券核销通知","original_type":"coupon","associated_data":"coupon","plain_text":{"stock_creator_mchid":"1652465541","stock_id":"20255099","coupon_id":"97046583699","coupon_name":"招行测试滚动有效期","description":"","status":"USED","create_time":"2025-03-17T19:38:52+08:00","coupon_type":"NORMAL","no_cash":false,"singleitem":false,"consume_information":{"consume_time":"2025-03-18T09:20:50+08:00","consume_mchid":"1532524971","transaction_id":"4200002702202503180978933760"}}}`
|
||||||
|
|
||||||
if err := wechatNotifyProducer(tag, bodyStr); err != nil {
|
if err := wechatNotifyProducer(tag, bodyStr); err != nil {
|
||||||
|
|
|
||||||
|
|
@ -90,19 +90,22 @@ func (w *WechatNotifyConsumer) consumeMessages(ctx context.Context, mqConsumer m
|
||||||
|
|
||||||
// NextConsumeTime前若不确认消息消费成功,则消息会被重复消费。
|
// NextConsumeTime前若不确认消息消费成功,则消息会被重复消费。
|
||||||
// 消息句柄有时间戳,同一条消息每次消费拿到的都不一样。
|
// 消息句柄有时间戳,同一条消息每次消费拿到的都不一样。
|
||||||
ackerr := mqConsumer.AckMessage(handles)
|
|
||||||
if ackerr != nil {
|
if len(handles) > 0 {
|
||||||
// 某些消息的句柄可能超时,会导致消息消费状态确认不成功。
|
go func(hs []string) {
|
||||||
if errAckItems, ok := ackerr.(errors.ErrCode).Context()["Detail"].([]mqhttpsdk.ErrAckItem); ok {
|
ackerr := mqConsumer.AckMessage(hs)
|
||||||
for _, errAckItem := range errAckItems {
|
if ackerr != nil {
|
||||||
log.Errorf("\tErrorHandle:%s, ErrorCode:%s, ErrorMsg:%s\n", errAckItem.ErrorHandle, errAckItem.ErrorCode, errAckItem.ErrorMsg)
|
log.Errorf("消息确认失败: %+v", ackerr)
|
||||||
|
// 记录失败句柄,后续处理
|
||||||
|
if errAckItems, ok := ackerr.(errors.ErrCode).Context()["Detail"].([]mqhttpsdk.ErrAckItem); ok {
|
||||||
|
for _, errAckItem := range errAckItems {
|
||||||
|
log.Errorf("失败句柄: %s, 错误码: %s, 错误信息: %s", errAckItem.ErrorHandle, errAckItem.ErrorCode, errAckItem.ErrorMsg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.Warnf("成功确认消息: %d条", len(hs))
|
||||||
}
|
}
|
||||||
} else {
|
}(handles)
|
||||||
log.Errorf("ack err:%+v\n", ackerr)
|
|
||||||
}
|
|
||||||
time.Sleep(time.Duration(3) * time.Second)
|
|
||||||
} else {
|
|
||||||
fmt.Printf("Ack ---->\n\t%s\n", handles)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
endChan <- 1
|
endChan <- 1
|
||||||
|
|
@ -121,6 +124,7 @@ func (w *WechatNotifyConsumer) consumeMessages(ctx context.Context, mqConsumer m
|
||||||
case <-time.After(35 * time.Second):
|
case <-time.After(35 * time.Second):
|
||||||
{
|
{
|
||||||
fmt.Println("Timeout of consumer message ??")
|
fmt.Println("Timeout of consumer message ??")
|
||||||
|
log.Errorf("消息处理超时,需要续期可见性")
|
||||||
endChan <- 1
|
endChan <- 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -129,7 +133,7 @@ func (w *WechatNotifyConsumer) consumeMessages(ctx context.Context, mqConsumer m
|
||||||
// 长轮询消费消息,网络超时时间默认为35s。
|
// 长轮询消费消息,网络超时时间默认为35s。
|
||||||
// 长轮询表示如果Topic没有消息,则客户端请求会在服务端挂起3s,3s内如果有消息可以消费则立即返回响应。
|
// 长轮询表示如果Topic没有消息,则客户端请求会在服务端挂起3s,3s内如果有消息可以消费则立即返回响应。
|
||||||
mqConsumer.ConsumeMessage(respChan, errChan,
|
mqConsumer.ConsumeMessage(respChan, errChan,
|
||||||
1, // 一次最多消费3条(最多可设置为16条)。
|
3, // 一次最多消费3条(最多可设置为16条)。
|
||||||
10, // 长轮询时间3s(最多可设置为30s)。
|
10, // 长轮询时间3s(最多可设置为30s)。
|
||||||
)
|
)
|
||||||
<-endChan
|
<-endChan
|
||||||
|
|
@ -137,7 +141,7 @@ func (w *WechatNotifyConsumer) consumeMessages(ctx context.Context, mqConsumer m
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop 停止消息消费
|
// Stop 停止消息消费
|
||||||
func (w *WechatNotifyConsumer) Stop(ctx context.Context) error {
|
func (w *WechatNotifyConsumer) Stop(_ context.Context) error {
|
||||||
fmt.Println("关闭 wechat consumer 中...")
|
fmt.Println("关闭 wechat consumer 中...")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,15 +27,13 @@ func (s *VoucherService) CronNotice(ctx context.Context) error {
|
||||||
|
|
||||||
return s.cron.AddFunc(c.Command, func() {
|
return s.cron.AddFunc(c.Command, func() {
|
||||||
|
|
||||||
if err := s.Notice(ctx); err != nil {
|
s.Notice(ctx)
|
||||||
log.Errorf("orderNotice定时任务执行发生错误: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *VoucherService) Notice(ctx context.Context) error {
|
func (s *VoucherService) Notice(ctx context.Context) {
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
|
|
||||||
if err := s.VoucherBiz.Notice(ctx); err != nil {
|
if err := s.VoucherBiz.Notice(ctx); err != nil {
|
||||||
|
|
@ -46,5 +44,5 @@ func (s *VoucherService) Notice(ctx context.Context) error {
|
||||||
elapsed := end.Sub(start)
|
elapsed := end.Sub(start)
|
||||||
log.Warnf("订单定时通知,开始执行时间%s,执行结束时间%s,代码块执行耗时: %s", start.Format(time.DateTime), end.Format(time.DateTime), elapsed)
|
log.Warnf("订单定时通知,开始执行时间%s,执行结束时间%s,代码块执行耗时: %s", start.Format(time.DateTime), end.Format(time.DateTime), elapsed)
|
||||||
|
|
||||||
return nil
|
return
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue