You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
1.5 KiB

package mq
import (
"epur-pay/pkg/logger"
"epur-pay/pkg/rds"
"epur-pay/pkg/utils"
"errors"
"gorm.io/gorm"
"reflect"
"runtime"
)
func (p *ConsumerApi) consumerEx() {
defer func() {
err := recover()
if err != nil {
buf := make([]byte, 1<<16)
runtime.Stack(buf, true)
e := reflect.ValueOf(err)
logger.ErrorLogger.Errorln(e.String(), string(buf))
p.E = errors.New(string(buf))
}
}()
var c int
for {
p.E = p.F(ComsumerParams{Data: []byte(p.A.Data), Func: p.A.Func, DB: p.DB})
if p.E != nil && p.A.Ack && p.A.RetryCount > c {
c++
continue
} else {
break
}
}
}
func (p *ConsumerApi) consumer() {
if p.A.Transaction {
if err := rds.DB.Transaction(func(ts *gorm.DB) error {
p.DB = ts
p.consumerEx()
p.end()
return p.E
}); err != nil {
logger.ErrorLogger.Errorln(err.Error())
}
} else {
p.DB = rds.DB
p.consumerEx()
p.end()
}
}
func (p *ConsumerApi) end() {
if p.E != nil {
p.A.Status = "1"
if p.A.Store {
utils.Error(rds.DB.Table(p.A.TableName()).Where(
"id=?", p.A.Id).Updates(map[string]interface{}{
"status": "1",
"err_msg": p.E.Error(),
}).Error)
}
} else {
p.A.Status = "0"
if p.A.Store {
utils.Error(rds.DB.Table(p.A.TableName()).Where(
"id=?", p.A.Id).Updates(map[string]interface{}{
"status": "0",
"complete_time": utils.Time2StampSecond(),
}).Error)
}
}
if !(p.E != nil && !p.A.ChainErrorTriger) {
for idx := range p.A.Chains {
p.P.add(p.A.Chains[idx])
}
}
}