go-common/app/interface/live/push-live/service/common_message.go
2019-04-22 18:49:16 +08:00

95 lines
2.9 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 service
import (
"context"
"encoding/json"
"go-common/app/interface/live/push-live/dao"
"go-common/app/interface/live/push-live/model"
"go-common/library/cache/redis"
"go-common/library/log"
"go-common/library/queue/databus"
)
// LiveCommonMessage 直播通用消息
func (s *Service) LiveCommonMessage(ctx context.Context, msg *databus.Message) (err error) {
defer msg.Commit()
var (
mids []int64
mMap = make(map[int64]bool) // mid去重
midMap = make(map[int][]int64) // 最终格式化后的mid map
)
m := new(model.LiveCommonMessage)
if err = json.Unmarshal(msg.Value, &m); err != nil {
log.Error("[service.common_message|LiveCommonMessage] json Unmarshal error(%v), model(%v)", err, m)
return
}
task := s.InitCommonTask(m)
if mids, err = s.convertStrToInt64(m.MsgContent.Mids); err != nil {
log.Error("[service.push|LiveCommonMessage] format Mids error(%v), task(%v), model(%v)", err, task, m)
return
}
// remove duplicated mid
for _, mid := range mids {
mMap[mid] = true
}
// mid filter
business := m.MsgContent.Business
filteredMids := s.midFilter(mMap, business, task)
midMap[business] = filteredMids
log.Info("[service.push|LiveCommonMessage] message info: before(%d), after(%d), model(%v), task(%v)",
len(mMap), len(midMap[business]), m, task)
total := s.Push(task, midMap)
// create push task
go s.CreatePushTask(task, total)
go s.setPushInterval(business, s.safeGetExpired(), filteredMids, task)
log.Info("[service.push|LiveCommonMessage] common message push done, total(%d), err(%v)", total, err)
return
}
// InitCommonTask Init push task by common message model
func (s *Service) InitCommonTask(m *model.LiveCommonMessage) (task *model.ApPushTask) {
task = &model.ApPushTask{
Type: model.LivePushType,
TargetID: 0,
AlertTitle: m.MsgContent.AlertTitle,
AlertBody: m.MsgContent.AlertBody,
MidSource: m.MsgContent.Business,
LinkType: m.MsgContent.LinkType,
LinkValue: m.MsgContent.LinkValue,
ExpireTime: m.MsgContent.ExpireTime,
Group: m.MsgContent.Group,
}
return task
}
// setPushInterval 活动预约对每个mid设置推送平滑key
func (s *Service) setPushInterval(business int, expired int32, mids []int64, task *model.ApPushTask) (total int, err error) {
if business != 111 {
return
}
var conn redis.Conn
defer func() {
if conn != nil {
conn.Close()
}
}()
// redis conn
conn, err = redis.Dial(s.c.Redis.PushInterval.Proto, s.c.Redis.PushInterval.Addr, s.dao.RedisOption()...)
if err != nil {
log.Error("[service.common_message|setPushInterval] redis.Dial error(%v), task(%v), mids(%d)",
err, task, len(mids))
return
}
for _, mid := range mids {
key := dao.GetIntervalKey(mid)
_, err = conn.Do("SET", key, task.LinkValue, "EX", expired)
if err != nil {
log.Error("[service.common_message|setPushInterval] set redis error(%v), task(%v), mid(%d)",
err, task, mid)
continue
}
total++
}
return
}