93 lines
2.8 KiB
Go
93 lines
2.8 KiB
Go
|
package service
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"go-common/app/interface/live/push-live/model"
|
|||
|
"go-common/library/log"
|
|||
|
"time"
|
|||
|
)
|
|||
|
|
|||
|
// liveMessageConsumeproc Live push related message handler
|
|||
|
func (s *Service) liveMessageConsumeproc() {
|
|||
|
defer func() {
|
|||
|
log.Warn("liveMessageConsumeproc exited.")
|
|||
|
s.wg.Done()
|
|||
|
}()
|
|||
|
var (
|
|||
|
liveStartMsgs = s.liveStartSub.Messages()
|
|||
|
liveCommonMsgs = s.liveCommonSub.Messages()
|
|||
|
)
|
|||
|
for {
|
|||
|
select {
|
|||
|
case msg, ok := <-liveStartMsgs:
|
|||
|
if !ok {
|
|||
|
log.Warn("[service.push|liveMessageConsumeproc] liveStartSub has been closed.")
|
|||
|
return
|
|||
|
}
|
|||
|
log.Info("[service.push|liveMessageConsumeproc] consume liveStartSub key(%s) offset(%d) message(%s)",
|
|||
|
msg.Key, msg.Offset, msg.Value)
|
|||
|
s.LiveStartMessage(context.TODO(), msg)
|
|||
|
case msg, ok := <-liveCommonMsgs:
|
|||
|
if !ok {
|
|||
|
log.Warn("[service.push|liveMessageConsumeproc] liveCommonSub has been closed.")
|
|||
|
return
|
|||
|
}
|
|||
|
log.Info("[service.push|liveMessageConsumeproc] consume liveCommonSub key(%s) offset(%d) message(%s)",
|
|||
|
msg.Key, msg.Offset, msg.Value)
|
|||
|
s.LiveCommonMessage(context.TODO(), msg)
|
|||
|
default:
|
|||
|
time.Sleep(time.Second * 3)
|
|||
|
continue
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Push 组装业务参数,调用推送平台接口
|
|||
|
func (s *Service) Push(task *model.ApPushTask, midMap map[int][]int64) (total int) {
|
|||
|
var shouldPushCount int
|
|||
|
for t, list := range midMap {
|
|||
|
length := len(list)
|
|||
|
shouldPushCount += length
|
|||
|
if length > 0 {
|
|||
|
// 调用批量推送方法,批量推送逻辑会切分mid与出错重试,最后返回实际推送成功数量
|
|||
|
task.Group = s.GetPushGroup(t, task.Group)
|
|||
|
pushCount := s.dao.BatchPush(&list, task)
|
|||
|
log.Info("[service.push|Push] push type(%d), count(%d), target_id(%v)", t, pushCount, task.TargetID)
|
|||
|
total += pushCount
|
|||
|
}
|
|||
|
}
|
|||
|
if shouldPushCount == 0 {
|
|||
|
log.Info("[service.push|Push] None to push, task(%+v)", task)
|
|||
|
return
|
|||
|
}
|
|||
|
log.Info("[service.push|Push] push done.should(%d), actual(%d), task(%+v).", shouldPushCount, total, task)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// CreatePushTask create push task
|
|||
|
func (s *Service) CreatePushTask(task *model.ApPushTask, total int) (affected int64, err error) {
|
|||
|
task.Total = total
|
|||
|
affected, err = s.dao.CreateNewTask(context.TODO(), task)
|
|||
|
if err != nil || affected == 0 {
|
|||
|
log.Error("[service.push|CreatePushTask] CreateNewTask error(%v), task(%+v)", err, task)
|
|||
|
return
|
|||
|
}
|
|||
|
log.Info("[service.push|CreatePushTask] CreateNewTask success, task(%+v)", task)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// GetPushGroup 获取不同类型的group
|
|||
|
// 兼容逻辑: 开播提醒topic有指定的group(并且单次开播需要区分关注与特别关注两个group),其余common message topic会传group
|
|||
|
func (s *Service) GetPushGroup(t int, g string) string {
|
|||
|
var group string
|
|||
|
switch t {
|
|||
|
case model.RelationAttention:
|
|||
|
group = model.AttentionGroup
|
|||
|
case model.RelationSpecial:
|
|||
|
group = model.SpecialGroup
|
|||
|
default:
|
|||
|
group = g
|
|||
|
}
|
|||
|
return group
|
|||
|
}
|