|
@@ -1,7 +1,6 @@
|
|
|
package job
|
|
|
|
|
|
import (
|
|
|
- "container/list"
|
|
|
"encoding/json"
|
|
|
"fmt"
|
|
|
. "match/config"
|
|
@@ -38,17 +37,7 @@ type Project struct {
|
|
|
}
|
|
|
|
|
|
type MatchJob struct {
|
|
|
- matchPool chan bool
|
|
|
- matchWaitGroup *sync.WaitGroup
|
|
|
- loadBiddingPool chan bool
|
|
|
- loadBiddingWaitGroup *sync.WaitGroup
|
|
|
- loadUserPool chan bool
|
|
|
- loadUserWaitGroup *sync.WaitGroup
|
|
|
- loadUserLock *sync.Mutex
|
|
|
- savePool chan bool
|
|
|
- saveWaitGroup *sync.WaitGroup
|
|
|
- userMapLock *sync.Mutex
|
|
|
- allProject *sync.Map
|
|
|
+ allProject *sync.Map
|
|
|
}
|
|
|
|
|
|
//定时任务,匹配数据,存库
|
|
@@ -106,202 +95,6 @@ func (m *MatchJob) Execute() {
|
|
|
//
|
|
|
}
|
|
|
|
|
|
-func (m *MatchJob) ToMatch(batchIndex int, matcher Matcher, datas *[]map[string]interface{}) {
|
|
|
- logger.Info("开始匹配第", batchIndex, "批用户。。。")
|
|
|
- userMap, projectUserMap := m.EachAllBidInfo(matcher, datas)
|
|
|
- logger.Info("第", batchIndex, "批用户匹配结束。。。")
|
|
|
- logger.Info("第", batchIndex, "批开始保存到", Pushspace_temp, "表。。。")
|
|
|
- index := 0
|
|
|
- var saveBatch []map[string]interface{}
|
|
|
- lock := &sync.Mutex{}
|
|
|
- for u, i := range *userMap {
|
|
|
- m.savePool <- true
|
|
|
- m.saveWaitGroup.Add(1)
|
|
|
- go func(user *UserInfo, infos *list.List) {
|
|
|
- defer func() {
|
|
|
- <-m.savePool
|
|
|
- m.saveWaitGroup.Done()
|
|
|
- }()
|
|
|
- var pushArray = make(SortList, 0)
|
|
|
- for e := infos.Front(); e != nil; e = e.Next() {
|
|
|
- matchInfo := *(e.Value.(*MatchInfo))
|
|
|
- pushArray = append(pushArray, &matchInfo)
|
|
|
- }
|
|
|
- //取最新50条
|
|
|
- sort.Sort(pushArray)
|
|
|
- var array []*MatchInfo
|
|
|
- titleMap := map[string]bool{}
|
|
|
- infoIdMap := map[string]bool{}
|
|
|
- size := 0
|
|
|
- for _, v2 := range pushArray {
|
|
|
- title := util.ObjToString((*v2.Info)["title"])
|
|
|
- _id := util.ObjToString((*v2.Info)["_id"])
|
|
|
- pushInfoKey := PushInfoKey(user.Id, _id)
|
|
|
- if titleMap[title] {
|
|
|
- continue
|
|
|
- }
|
|
|
- titleMap[title] = true
|
|
|
- isExists, err := redis.Exists(Pushcache_2_a, pushInfoKey)
|
|
|
- if err != nil {
|
|
|
- logger.Error(pushInfoKey, "推送信息redis判重出错", err)
|
|
|
- }
|
|
|
- if isExists {
|
|
|
- continue
|
|
|
- }
|
|
|
- redis.Put(Pushcache_2_a, pushInfoKey, 1, OneDaySecond)
|
|
|
- info := map[string]interface{}{}
|
|
|
- for _, field := range SaveFields {
|
|
|
- if (*v2.Info)[field] == nil {
|
|
|
- continue
|
|
|
- }
|
|
|
- info[field] = (*v2.Info)[field]
|
|
|
- }
|
|
|
- infoIdMap[_id] = true
|
|
|
- array = append(array, &MatchInfo{
|
|
|
- Info: &info,
|
|
|
- Keys: v2.Keys,
|
|
|
- })
|
|
|
- size++
|
|
|
- maxPushSize := Config.MaxPushSize
|
|
|
- if IsVipUser(user.VipStatus) {
|
|
|
- maxPushSize = Config.VipMaxPushSize
|
|
|
- }
|
|
|
- if size == maxPushSize {
|
|
|
- break
|
|
|
- }
|
|
|
- }
|
|
|
- if size == 0 {
|
|
|
- return
|
|
|
- }
|
|
|
- lock.Lock()
|
|
|
- defer lock.Unlock()
|
|
|
- saveBatch = append(saveBatch, map[string]interface{}{
|
|
|
- "s_m_openid": user.S_m_openid,
|
|
|
- "a_m_openid": user.A_m_openid,
|
|
|
- "phone": user.Phone,
|
|
|
- "jpushid": user.Jpushid,
|
|
|
- "opushid": user.Opushid,
|
|
|
- "appphonetype": user.AppPhoneType,
|
|
|
- "userid": user.Id,
|
|
|
- "ratemode": user.RateMode,
|
|
|
- "wxpush": user.WxPush,
|
|
|
- "apppush": user.AppPush,
|
|
|
- "mailpush": user.MailPush,
|
|
|
- "pchelperpush": user.PcHelperPush,
|
|
|
- "usertype": user.UserType,
|
|
|
- "email": user.Email,
|
|
|
- "list": array,
|
|
|
- "size": size,
|
|
|
- "subscribe": user.Subscribe,
|
|
|
- "applystatus": user.ApplyStatus,
|
|
|
- "words": user.Keys,
|
|
|
- "modifydate": user.ModifyDate,
|
|
|
- "mergeorder": user.MergeOrder,
|
|
|
- "timestamp": time.Now().Unix(),
|
|
|
- "nickname": user.NickName,
|
|
|
- "firstpushtime": user.FirstPushTime,
|
|
|
- "vipstatus": user.VipStatus,
|
|
|
- })
|
|
|
- if len(saveBatch) == BulkSize {
|
|
|
- mongodb.SaveBulk(Pushspace_temp, saveBatch...)
|
|
|
- saveBatch = []map[string]interface{}{}
|
|
|
- }
|
|
|
- }(u, i)
|
|
|
- index++
|
|
|
- if index%500 == 0 {
|
|
|
- logger.Info(Pushspace_temp, index)
|
|
|
- }
|
|
|
- }
|
|
|
- m.saveWaitGroup.Wait()
|
|
|
- if len(saveBatch) > 0 {
|
|
|
- mongodb.SaveBulk(Pushspace_temp, saveBatch...)
|
|
|
- saveBatch = []map[string]interface{}{}
|
|
|
- }
|
|
|
- logger.Info("第", batchIndex, "批保存到", Pushspace_temp, "表结束。。", index)
|
|
|
- m.ToRelationProject(projectUserMap)
|
|
|
-}
|
|
|
-
|
|
|
-//关联项目
|
|
|
-func (m *MatchJob) ToRelationProject(projectUser *sync.Map) {
|
|
|
- logger.Info("开始关联项目。。。")
|
|
|
- index := 0
|
|
|
- var updateproject [][]map[string]interface{}
|
|
|
- lock := &sync.Mutex{}
|
|
|
- projectUser.Range(func(key interface{}, value interface{}) bool {
|
|
|
- k, _ := key.(string)
|
|
|
- v, _ := value.(*[]*UserInfo)
|
|
|
- m.savePool <- true
|
|
|
- m.saveWaitGroup.Add(1)
|
|
|
- go func(_id string, users *[]*UserInfo) {
|
|
|
- defer func() {
|
|
|
- <-m.savePool
|
|
|
- m.saveWaitGroup.Done()
|
|
|
- }()
|
|
|
- list_last_infoid := ""
|
|
|
- projectId := ""
|
|
|
- if value, ok := m.allProject.Load(_id); ok {
|
|
|
- project, _ := value.(*Project)
|
|
|
- projectId = project.Id
|
|
|
- list_last_infoid = project.List_last_infoid
|
|
|
- } else {
|
|
|
- projects := elastic.Get(Projectset, Projectset, fmt.Sprintf(ProjectQuery, _id))
|
|
|
- if projects == nil || len(*projects) == 0 {
|
|
|
- return
|
|
|
- }
|
|
|
- list := (*projects)[0]["list"].([]interface{})
|
|
|
- if len(list) == 0 {
|
|
|
- return
|
|
|
- }
|
|
|
- list_last, _ := list[len(list)-1].(map[string]interface{})
|
|
|
- list_last_infoid = util.ObjToString(list_last["infoid"])
|
|
|
- projectId, _ := (*projects)[0]["_id"].(string)
|
|
|
- m.allProject.Store(_id, &Project{
|
|
|
- Id: projectId,
|
|
|
- List_last_infoid: list_last_infoid,
|
|
|
- })
|
|
|
- }
|
|
|
- if projectId == "" || list_last_infoid == "" {
|
|
|
- return
|
|
|
- }
|
|
|
- lock.Lock()
|
|
|
- defer lock.Unlock()
|
|
|
- for _, user := range *users {
|
|
|
- updateproject = append(updateproject, []map[string]interface{}{
|
|
|
- map[string]interface{}{
|
|
|
- "projectid": projectId,
|
|
|
- "userid": user.Id,
|
|
|
- },
|
|
|
- map[string]interface{}{
|
|
|
- "$set": map[string]interface{}{
|
|
|
- "projectid": projectId,
|
|
|
- "infoid": _id,
|
|
|
- "userid": user.Id,
|
|
|
- "maxid": list_last_infoid,
|
|
|
- "subtypes": user.O_vipjy.SubTypes,
|
|
|
- "createtime": time.Now().Unix(),
|
|
|
- },
|
|
|
- },
|
|
|
- })
|
|
|
- }
|
|
|
- if len(updateproject) == BigBulkSize {
|
|
|
- mongodb.NewUpdateBulk(Pushspace_project, true, true, updateproject...)
|
|
|
- updateproject = [][]map[string]interface{}{}
|
|
|
- }
|
|
|
- }(k, v)
|
|
|
- index++
|
|
|
- if index%500 == 0 {
|
|
|
- logger.Info("关联项目", index)
|
|
|
- }
|
|
|
- return true
|
|
|
- })
|
|
|
- m.saveWaitGroup.Wait()
|
|
|
- if len(updateproject) > 0 {
|
|
|
- mongodb.NewUpdateBulk(Pushspace_project, true, true, updateproject...)
|
|
|
- updateproject = [][]map[string]interface{}{}
|
|
|
- }
|
|
|
- logger.Info("关联项目结束。。。", index)
|
|
|
-}
|
|
|
-
|
|
|
//加载数据到内存中
|
|
|
func (m *MatchJob) LoadBidding(lastId, newId string, lastTime int64) *[]map[string]interface{} {
|
|
|
defer util.Catch()
|
|
@@ -342,13 +135,15 @@ func (m *MatchJob) LoadBidding(lastId, newId string, lastTime int64) *[]map[stri
|
|
|
"buyerclass": 1,
|
|
|
}).Sort("_id").Iter()
|
|
|
index := 0
|
|
|
+ loadBiddingPool := make(chan bool, Config.LoadBiddingPoolSize)
|
|
|
+ loadBiddingWaitGroup := &sync.WaitGroup{}
|
|
|
for data := make(map[string]interface{}); it.Next(&data); {
|
|
|
- m.loadBiddingPool <- true
|
|
|
- m.loadBiddingWaitGroup.Add(1)
|
|
|
+ loadBiddingPool <- true
|
|
|
+ loadBiddingWaitGroup.Add(1)
|
|
|
go func(temp map[string]interface{}) {
|
|
|
defer func() {
|
|
|
- <-m.loadBiddingPool
|
|
|
- m.loadBiddingWaitGroup.Done()
|
|
|
+ <-loadBiddingPool
|
|
|
+ loadBiddingWaitGroup.Done()
|
|
|
}()
|
|
|
_id := util.BsonIdToSId(temp["_id"])
|
|
|
temp["_id"] = _id
|
|
@@ -369,10 +164,10 @@ func (m *MatchJob) LoadBidding(lastId, newId string, lastTime int64) *[]map[stri
|
|
|
data = make(map[string]interface{})
|
|
|
index++
|
|
|
if index%500 == 0 {
|
|
|
- logger.Info(Bidding, index)
|
|
|
+ logger.Info("加载", Bidding, "数据:", index)
|
|
|
}
|
|
|
}
|
|
|
- m.loadBiddingWaitGroup.Wait()
|
|
|
+ loadBiddingWaitGroup.Wait()
|
|
|
logger.Info(Bidding, "数据已经加载结束。。。", index)
|
|
|
return &res
|
|
|
}
|
|
@@ -410,13 +205,17 @@ func (m *MatchJob) OnceUserBatch(batchIndex int, lastUserId *string) (int, *VipU
|
|
|
//免费用户
|
|
|
title_key_user := make(map[string]*[]*UserInfo)
|
|
|
title_notkey_user := make(map[string]*[]*UserInfo)
|
|
|
+ //
|
|
|
+ loadUserPool := make(chan bool, Config.LoadUserPoolSize)
|
|
|
+ loadUserWaitGroup := &sync.WaitGroup{}
|
|
|
+ lock := &sync.Mutex{}
|
|
|
for userTemp := make(map[string]interface{}); query.Next(&userTemp); {
|
|
|
- m.loadUserPool <- true
|
|
|
- m.loadUserWaitGroup.Add(1)
|
|
|
+ loadUserPool <- true
|
|
|
+ loadUserWaitGroup.Add(1)
|
|
|
go func(temp map[string]interface{}) {
|
|
|
defer func() {
|
|
|
- <-m.loadUserPool
|
|
|
- m.loadUserWaitGroup.Done()
|
|
|
+ <-loadUserPool
|
|
|
+ loadUserWaitGroup.Done()
|
|
|
}()
|
|
|
user, o_msgset := public.NewUserInfoByUserColl(temp)
|
|
|
if user == nil {
|
|
@@ -519,8 +318,8 @@ func (m *MatchJob) OnceUserBatch(batchIndex int, lastUserId *string) (int, *VipU
|
|
|
user.Keys = originalKeys
|
|
|
user.Key_notkey = key_notkey
|
|
|
/***************start*****************/
|
|
|
- m.loadUserLock.Lock()
|
|
|
- defer m.loadUserLock.Unlock()
|
|
|
+ lock.Lock()
|
|
|
+ defer lock.Unlock()
|
|
|
if isVipUser {
|
|
|
user.O_vipjy = &O_vipjy{
|
|
|
ProjectMatch: util.IntAll(o_msgset["i_projectmatch"]),
|
|
@@ -599,7 +398,7 @@ func (m *MatchJob) OnceUserBatch(batchIndex int, lastUserId *string) (int, *VipU
|
|
|
break
|
|
|
}
|
|
|
}
|
|
|
- m.loadUserWaitGroup.Wait()
|
|
|
+ loadUserWaitGroup.Wait()
|
|
|
//
|
|
|
vip_title_pjob := &KeyDfa{
|
|
|
Key_user: &vip_title_key_user,
|
|
@@ -653,26 +452,48 @@ func (m *MatchJob) MakeKeyUser(keys []string, user *UserInfo, key_user *map[stri
|
|
|
}
|
|
|
|
|
|
//遍历数据并执行推送操作
|
|
|
-func (m *MatchJob) EachAllBidInfo(matcher Matcher, datas *[]map[string]interface{}) (*map[*UserInfo]*list.List, *sync.Map) {
|
|
|
+func (m *MatchJob) EachAllBidInfo(matcher Matcher, datas *[]map[string]interface{}) (*map[*UserInfo]*SortList, *map[*UserInfo]*[]string) {
|
|
|
defer util.Catch()
|
|
|
logger.Info("开始匹配数据。。。")
|
|
|
- userMap := map[*UserInfo]*list.List{}
|
|
|
- relationProject := &sync.Map{}
|
|
|
+ userMap := map[*UserInfo]*SortList{}
|
|
|
+ projectUserMap := map[*UserInfo]*[]string{}
|
|
|
+ lock := &sync.Mutex{}
|
|
|
var index int
|
|
|
+ matchPool := make(chan bool, Config.MatchPoolSize)
|
|
|
+ matchWaitGroup := &sync.WaitGroup{}
|
|
|
for _, temp := range *datas {
|
|
|
- m.matchPool <- true
|
|
|
- m.matchWaitGroup.Add(1)
|
|
|
+ matchPool <- true
|
|
|
+ matchWaitGroup.Add(1)
|
|
|
go func(info map[string]interface{}) {
|
|
|
defer func() {
|
|
|
- m.matchWaitGroup.Done()
|
|
|
- <-m.matchPool
|
|
|
+ matchWaitGroup.Done()
|
|
|
+ <-matchPool
|
|
|
}()
|
|
|
users, projectUsers := matcher.Match(&info)
|
|
|
+ lock.Lock()
|
|
|
+ defer lock.Unlock()
|
|
|
if users != nil && len(*users) > 0 {
|
|
|
- m.EachInfoToUser(users, &info, &userMap)
|
|
|
+ for k, v := range *users {
|
|
|
+ l := userMap[k]
|
|
|
+ if l == nil {
|
|
|
+ l = &SortList{}
|
|
|
+ }
|
|
|
+ *l = append(*l, &MatchInfo{
|
|
|
+ Info: &info,
|
|
|
+ Keys: v.Keys,
|
|
|
+ })
|
|
|
+ userMap[k] = l
|
|
|
+ }
|
|
|
}
|
|
|
if projectUsers != nil && len(*projectUsers) > 0 {
|
|
|
- relationProject.Store(util.ObjToString(info["_id"]), projectUsers)
|
|
|
+ for _, v := range *projectUsers {
|
|
|
+ l := projectUserMap[v]
|
|
|
+ if l == nil {
|
|
|
+ l = &[]string{}
|
|
|
+ }
|
|
|
+ *l = append(*l, util.ObjToString(info["_id"]))
|
|
|
+ projectUserMap[v] = l
|
|
|
+ }
|
|
|
}
|
|
|
}(temp)
|
|
|
index++
|
|
@@ -680,24 +501,225 @@ func (m *MatchJob) EachAllBidInfo(matcher Matcher, datas *[]map[string]interface
|
|
|
logger.Info("匹配数据", index)
|
|
|
}
|
|
|
}
|
|
|
- m.matchWaitGroup.Wait()
|
|
|
+ matchWaitGroup.Wait()
|
|
|
logger.Info("匹配数据结束。。。", index)
|
|
|
- return &userMap, relationProject
|
|
|
+ return &userMap, &projectUserMap
|
|
|
+}
|
|
|
+func (m *MatchJob) ToMatch(batchIndex int, matcher Matcher, datas *[]map[string]interface{}) {
|
|
|
+ logger.Info("开始匹配第", batchIndex, "批用户。。。")
|
|
|
+ userMap, projectUserMap := m.EachAllBidInfo(matcher, datas)
|
|
|
+ logger.Info("第", batchIndex, "批用户匹配结束。。。")
|
|
|
+ logger.Info("第", batchIndex, "批开始保存到", Pushspace_temp, "表。。。")
|
|
|
+ index := 0
|
|
|
+ var saveBatch []map[string]interface{}
|
|
|
+ myMatchId := map[string]map[string]bool{}
|
|
|
+ myFilterId := map[string]map[string]bool{}
|
|
|
+ //
|
|
|
+ savePool := make(chan bool, Config.SavePoolSize)
|
|
|
+ saveWaitGroup := &sync.WaitGroup{}
|
|
|
+ lock := &sync.Mutex{}
|
|
|
+ for k, v := range *userMap {
|
|
|
+ savePool <- true
|
|
|
+ saveWaitGroup.Add(1)
|
|
|
+ go func(user *UserInfo, infos *SortList) {
|
|
|
+ defer func() {
|
|
|
+ <-savePool
|
|
|
+ saveWaitGroup.Done()
|
|
|
+ }()
|
|
|
+ //取最新50条
|
|
|
+ sort.Sort(infos)
|
|
|
+ var array []*MatchInfo
|
|
|
+ matchTitle := map[string]bool{}
|
|
|
+ matchId := map[string]bool{}
|
|
|
+ filterId := map[string]bool{}
|
|
|
+ size := 0
|
|
|
+ for _, v2 := range *infos {
|
|
|
+ title := util.ObjToString((*v2.Info)["title"])
|
|
|
+ _id := util.ObjToString((*v2.Info)["_id"])
|
|
|
+ pushInfoKey := PushInfoKey(user.Id, _id)
|
|
|
+ if matchTitle[title] {
|
|
|
+ filterId[_id] = true
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ matchTitle[title] = true
|
|
|
+ isExists, err := redis.Exists(Pushcache_2_a, pushInfoKey)
|
|
|
+ if err != nil {
|
|
|
+ logger.Error(pushInfoKey, "推送信息redis判重出错", err)
|
|
|
+ }
|
|
|
+ if isExists {
|
|
|
+ filterId[_id] = true
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ redis.Put(Pushcache_2_a, pushInfoKey, 1, OneDaySecond)
|
|
|
+ info := map[string]interface{}{}
|
|
|
+ for _, field := range SaveFields {
|
|
|
+ if (*v2.Info)[field] == nil {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ info[field] = (*v2.Info)[field]
|
|
|
+ }
|
|
|
+ matchId[_id] = true
|
|
|
+ array = append(array, &MatchInfo{
|
|
|
+ Info: &info,
|
|
|
+ Keys: v2.Keys,
|
|
|
+ })
|
|
|
+ size++
|
|
|
+ maxPushSize := Config.MaxPushSize
|
|
|
+ if IsVipUser(user.VipStatus) {
|
|
|
+ maxPushSize = Config.VipMaxPushSize
|
|
|
+ }
|
|
|
+ if size == maxPushSize {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if size == 0 {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ lock.Lock()
|
|
|
+ defer lock.Unlock()
|
|
|
+ myMatchId[user.Id] = matchId
|
|
|
+ myFilterId[user.Id] = filterId
|
|
|
+ saveBatch = append(saveBatch, map[string]interface{}{
|
|
|
+ "s_m_openid": user.S_m_openid,
|
|
|
+ "a_m_openid": user.A_m_openid,
|
|
|
+ "phone": user.Phone,
|
|
|
+ "jpushid": user.Jpushid,
|
|
|
+ "opushid": user.Opushid,
|
|
|
+ "appphonetype": user.AppPhoneType,
|
|
|
+ "userid": user.Id,
|
|
|
+ "ratemode": user.RateMode,
|
|
|
+ "wxpush": user.WxPush,
|
|
|
+ "apppush": user.AppPush,
|
|
|
+ "mailpush": user.MailPush,
|
|
|
+ "pchelperpush": user.PcHelperPush,
|
|
|
+ "usertype": user.UserType,
|
|
|
+ "email": user.Email,
|
|
|
+ "list": array,
|
|
|
+ "size": size,
|
|
|
+ "subscribe": user.Subscribe,
|
|
|
+ "applystatus": user.ApplyStatus,
|
|
|
+ "words": user.Keys,
|
|
|
+ "modifydate": user.ModifyDate,
|
|
|
+ "mergeorder": user.MergeOrder,
|
|
|
+ "timestamp": time.Now().Unix(),
|
|
|
+ "nickname": user.NickName,
|
|
|
+ "firstpushtime": user.FirstPushTime,
|
|
|
+ "vipstatus": user.VipStatus,
|
|
|
+ })
|
|
|
+ if len(saveBatch) == BulkSize {
|
|
|
+ mongodb.SaveBulk(Pushspace_temp, saveBatch...)
|
|
|
+ saveBatch = []map[string]interface{}{}
|
|
|
+ }
|
|
|
+ }(k, v)
|
|
|
+ index++
|
|
|
+ if index%500 == 0 {
|
|
|
+ logger.Info("保存到", Pushspace_temp, "表:", index)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ saveWaitGroup.Wait()
|
|
|
+ if len(saveBatch) > 0 {
|
|
|
+ mongodb.SaveBulk(Pushspace_temp, saveBatch...)
|
|
|
+ saveBatch = []map[string]interface{}{}
|
|
|
+ }
|
|
|
+ logger.Info("第", batchIndex, "批保存到", Pushspace_temp, "表结束。。。", index)
|
|
|
+ m.ToRelationProject(projectUserMap, &myMatchId, &myFilterId)
|
|
|
}
|
|
|
|
|
|
-//遍历用户加入到此条信息上
|
|
|
-func (m *MatchJob) EachInfoToUser(users *map[*UserInfo]*MatchUser, info *map[string]interface{}, userMap *map[*UserInfo]*list.List) {
|
|
|
- defer m.userMapLock.Unlock()
|
|
|
- m.userMapLock.Lock()
|
|
|
- for k, v := range *users {
|
|
|
- l := (*userMap)[k]
|
|
|
- if l == nil {
|
|
|
- l = list.New()
|
|
|
+//关联项目
|
|
|
+func (m *MatchJob) ToRelationProject(projectUser *map[*UserInfo]*[]string, myMatchId, myFilterId *map[string]map[string]bool) {
|
|
|
+ logger.Info("开始关联项目。。。")
|
|
|
+ index := 0
|
|
|
+ var updateproject [][]map[string]interface{}
|
|
|
+ //
|
|
|
+ savePool := make(chan bool, Config.SavePoolSize)
|
|
|
+ saveWaitGroup := &sync.WaitGroup{}
|
|
|
+ lock := &sync.Mutex{}
|
|
|
+ for k, v := range *projectUser {
|
|
|
+ savePool <- true
|
|
|
+ saveWaitGroup.Add(1)
|
|
|
+ go func(user *UserInfo, _ids *[]string) {
|
|
|
+ defer func() {
|
|
|
+ <-savePool
|
|
|
+ saveWaitGroup.Done()
|
|
|
+ }()
|
|
|
+ needLength := Config.MaxPushSize - len((*myMatchId)[user.Id])
|
|
|
+ for _, _id := range *_ids {
|
|
|
+ if (*myFilterId)[user.Id] != nil && (*myFilterId)[user.Id][_id] {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ //如果有信息类型,优先用订阅匹配上的信息,然后最多关联50条
|
|
|
+ if len(user.O_vipjy.SubTypes) > 0 {
|
|
|
+ if (*myMatchId)[user.Id] == nil || !(*myMatchId)[user.Id][_id] {
|
|
|
+ if needLength > 0 {
|
|
|
+ needLength--
|
|
|
+ } else {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else { //如果没有信息类型,只关联订阅匹配上的信息
|
|
|
+ if (*myMatchId)[user.Id] == nil || !(*myMatchId)[user.Id][_id] {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ }
|
|
|
+ list_last_infoid := ""
|
|
|
+ projectId := ""
|
|
|
+ if value, ok := m.allProject.Load(_id); ok {
|
|
|
+ project, _ := value.(*Project)
|
|
|
+ projectId = project.Id
|
|
|
+ list_last_infoid = project.List_last_infoid
|
|
|
+ } else {
|
|
|
+ projects := elastic.Get(Projectset, Projectset, fmt.Sprintf(ProjectQuery, _id))
|
|
|
+ if projects == nil || len(*projects) == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ list := (*projects)[0]["list"].([]interface{})
|
|
|
+ if len(list) == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ list_last, _ := list[len(list)-1].(map[string]interface{})
|
|
|
+ list_last_infoid = util.ObjToString(list_last["infoid"])
|
|
|
+ projectId, _ = (*projects)[0]["_id"].(string)
|
|
|
+ m.allProject.Store(_id, &Project{
|
|
|
+ Id: projectId,
|
|
|
+ List_last_infoid: list_last_infoid,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if projectId == "" || list_last_infoid == "" {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ lock.Lock()
|
|
|
+ updateproject = append(updateproject, []map[string]interface{}{
|
|
|
+ map[string]interface{}{
|
|
|
+ "projectid": projectId,
|
|
|
+ "userid": user.Id,
|
|
|
+ },
|
|
|
+ map[string]interface{}{
|
|
|
+ "$set": map[string]interface{}{
|
|
|
+ "projectid": projectId,
|
|
|
+ "infoid": _id,
|
|
|
+ "userid": user.Id,
|
|
|
+ "maxid": list_last_infoid,
|
|
|
+ "subtypes": user.O_vipjy.SubTypes,
|
|
|
+ "createtime": time.Now().Unix(),
|
|
|
+ },
|
|
|
+ },
|
|
|
+ })
|
|
|
+ if len(updateproject) == BigBulkSize {
|
|
|
+ mongodb.NewUpdateBulk(Pushspace_project, true, true, updateproject...)
|
|
|
+ updateproject = [][]map[string]interface{}{}
|
|
|
+ }
|
|
|
+ lock.Unlock()
|
|
|
+ }
|
|
|
+ }(k, v)
|
|
|
+ index++
|
|
|
+ if index%500 == 0 {
|
|
|
+ logger.Info("关联项目:", index)
|
|
|
}
|
|
|
- l.PushBack(&MatchInfo{
|
|
|
- Info: info,
|
|
|
- Keys: v.Keys,
|
|
|
- })
|
|
|
- (*userMap)[k] = l
|
|
|
}
|
|
|
+ saveWaitGroup.Wait()
|
|
|
+ if len(updateproject) > 0 {
|
|
|
+ mongodb.NewUpdateBulk(Pushspace_project, true, true, updateproject...)
|
|
|
+ updateproject = [][]map[string]interface{}{}
|
|
|
+ }
|
|
|
+ logger.Info("关联项目结束。。。", index)
|
|
|
}
|