go-common/app/job/main/app-wall/service/unicom/service.go

123 lines
2.7 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
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)
}
}