- timer task shceuled to order goroutine to avoid concurrent problem.
This commit is contained in:
@@ -48,7 +48,18 @@ func init() {
|
||||
Timeout: 1 * time.Second,
|
||||
TimeoutAction: func(order *model.GoodsOrder) (err error) {
|
||||
_ = sch.handleAutoAcceptOrder(order.VendorOrderID, order.VendorID, order.ConsigneeMobile, jxutils.GetJxStoreIDFromOrder(order), nil, func(isAcceptIt bool) error {
|
||||
return sch.AcceptOrRefuseOrder(order, isAcceptIt)
|
||||
if err = sch.AcceptOrRefuseOrder(order, isAcceptIt); err != nil {
|
||||
// 为了解决京东新消息与接单消息乱序的问题
|
||||
if errWithCode, ok := err.(*utils.ErrorWithCode); ok && errWithCode.Level() == 1 && errWithCode.IntCode() == -1 {
|
||||
if order2, err2 := sch.CurOrderManager.LoadOrder(order.VendorOrderID, order.VendorID); err2 == nil && order2.Status > order.Status {
|
||||
sch.OnOrderStatusChanged(model.Order2Status(order2))
|
||||
err = nil
|
||||
} else {
|
||||
err = err2
|
||||
}
|
||||
}
|
||||
}
|
||||
return err
|
||||
})
|
||||
return nil
|
||||
},
|
||||
@@ -75,7 +86,7 @@ func (s *DefScheduler) OnOrderNew(order *model.GoodsOrder) (err error) {
|
||||
order: order,
|
||||
}
|
||||
s.orderMap.Store(jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID), watchInfo)
|
||||
s.resetTimer(watchInfo, model.OrderStatusNew, order.OrderCreatedAt, 0)
|
||||
s.resetTimer(watchInfo, watchInfo.order.Status, order.OrderCreatedAt, 0)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -301,9 +312,13 @@ func (s *DefScheduler) resetTimer(savedOrderInfo *WatchOrderInfo, status int, be
|
||||
timeout := jxutils.GetRealTimeout(beginTime, config.Timeout, minTimeout) + gap
|
||||
globals.SugarLogger.Debugf("resetTimer timeout:%v, orderID:%s", timeout, savedOrderInfo.order.VendorOrderID)
|
||||
savedOrderInfo.timerStatus = status
|
||||
order := savedOrderInfo.order
|
||||
savedOrderInfo.timer = time.AfterFunc(timeout, func() {
|
||||
config.TimeoutAction(savedOrderInfo.order)
|
||||
savedOrderInfo.timerStatus = 0 // todo 可能有线程安全问题,考虑加入订单队列
|
||||
// order 事件序列化
|
||||
jxutils.CallMsgHandlerAsync(func() {
|
||||
config.TimeoutAction(order)
|
||||
savedOrderInfo.timerStatus = 0
|
||||
}, order.VendorOrderID)
|
||||
})
|
||||
}
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user