123 lines
2.7 KiB
Go
123 lines
2.7 KiB
Go
|
package unicom
|
||
|
|
||
|
import (
|
||
|
"sync"
|
||
|
"time"
|
||
|
|
||
|
"go-common/app/job/main/app-wall/conf"
|
||
|
seqDao "go-common/app/job/main/app-wall/dao/seq"
|
||
|
unicomDao "go-common/app/job/main/app-wall/dao/unicom"
|
||
|
"go-common/app/job/main/app-wall/model/unicom"
|
||
|
"go-common/library/log"
|
||
|
"go-common/library/queue/databus"
|
||
|
"go-common/library/stat/prom"
|
||
|
)
|
||
|
|
||
|
type Service struct {
|
||
|
c *conf.Config
|
||
|
dao *unicomDao.Dao
|
||
|
seqdao *seqDao.Dao
|
||
|
clickSub *databus.Databus
|
||
|
closed bool
|
||
|
// waiter
|
||
|
waiter sync.WaitGroup
|
||
|
cliChan []chan *unicom.ClickMsg
|
||
|
dbcliChan []chan *unicom.UserBind
|
||
|
// infoc
|
||
|
logCh []chan interface{}
|
||
|
packCh chan interface{}
|
||
|
packLogCh chan interface{}
|
||
|
integralLogCh []chan interface{}
|
||
|
// prom
|
||
|
pHit *prom.Prom
|
||
|
pMiss *prom.Prom
|
||
|
// tick
|
||
|
tick time.Duration
|
||
|
lastmonth map[int]bool
|
||
|
}
|
||
|
|
||
|
func New(c *conf.Config) (s *Service) {
|
||
|
s = &Service{
|
||
|
c: c,
|
||
|
dao: unicomDao.New(c),
|
||
|
clickSub: databus.New(c.ReportDatabus),
|
||
|
seqdao: seqDao.New(c),
|
||
|
// infoc
|
||
|
packCh: make(chan interface{}, 1024),
|
||
|
packLogCh: make(chan interface{}, 1024),
|
||
|
// close
|
||
|
closed: false,
|
||
|
// prom
|
||
|
pHit: prom.CacheHit,
|
||
|
pMiss: prom.CacheMiss,
|
||
|
lastmonth: map[int]bool{},
|
||
|
// tick
|
||
|
tick: time.Duration(c.Tick),
|
||
|
}
|
||
|
for i := int64(0); i < s.c.ChanNum; i++ {
|
||
|
s.cliChan = append(s.cliChan, make(chan *unicom.ClickMsg, 300000))
|
||
|
}
|
||
|
for i := int64(0); i < s.c.ChanDBNum; i++ {
|
||
|
s.dbcliChan = append(s.dbcliChan, make(chan *unicom.UserBind, 1024))
|
||
|
s.integralLogCh = append(s.integralLogCh, make(chan interface{}, 1024))
|
||
|
s.logCh = append(s.logCh, make(chan interface{}, 1024))
|
||
|
}
|
||
|
for i := int64(0); i < s.c.ChanNum; i++ {
|
||
|
s.waiter.Add(1)
|
||
|
go s.cliChanProc(i)
|
||
|
}
|
||
|
for i := int64(0); i < s.c.ChanDBNum; i++ {
|
||
|
s.waiter.Add(1)
|
||
|
go s.unicomInfocproc(i)
|
||
|
go s.addUserIntegralLogproc(i)
|
||
|
}
|
||
|
for i := int64(0); i < s.c.ChanDBNum; i++ {
|
||
|
s.waiter.Add(1)
|
||
|
go s.dbcliChanProc(i)
|
||
|
}
|
||
|
s.waiter.Add(1)
|
||
|
go s.clickConsumer()
|
||
|
s.waiter.Add(1)
|
||
|
now := time.Now()
|
||
|
if s.c.Monthly {
|
||
|
// s.updatemonth(now)
|
||
|
s.upBindAll()
|
||
|
}
|
||
|
s.waiter.Add(1)
|
||
|
s.loadUnicomIPOrder(now)
|
||
|
s.loadUnicomFlow()
|
||
|
go s.loadproc()
|
||
|
s.waiter.Add(1)
|
||
|
go s.unicomPackInfocproc()
|
||
|
go s.addUserPackLogproc()
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// Close Service
|
||
|
func (s *Service) Close() {
|
||
|
s.closed = true
|
||
|
time.Sleep(time.Second * 2)
|
||
|
s.clickSub.Close()
|
||
|
for i := 0; i < len(s.cliChan); i++ {
|
||
|
close(s.cliChan[i])
|
||
|
}
|
||
|
for i := 0; i < len(s.dbcliChan); i++ {
|
||
|
close(s.dbcliChan[i])
|
||
|
close(s.integralLogCh[i])
|
||
|
close(s.logCh[i])
|
||
|
}
|
||
|
s.waiter.Wait()
|
||
|
log.Info("app-wall-job unicom flow closed.")
|
||
|
}
|
||
|
|
||
|
// cacheproc load cache
|
||
|
func (s *Service) loadproc() {
|
||
|
for {
|
||
|
time.Sleep(s.tick)
|
||
|
now := time.Now()
|
||
|
s.loadUnicomFlow()
|
||
|
s.updatemonth(now)
|
||
|
s.loadUnicomIPOrder(now)
|
||
|
}
|
||
|
}
|