118 lines
2.7 KiB
Go
118 lines
2.7 KiB
Go
package dao
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"net/url"
|
|
"time"
|
|
|
|
"go-common/app/job/main/history/conf"
|
|
"go-common/app/service/main/history/model"
|
|
"go-common/library/cache/redis"
|
|
"go-common/library/database/tidb"
|
|
"go-common/library/log"
|
|
bm "go-common/library/net/http/blademaster"
|
|
|
|
"go-common/library/database/hbase.v2"
|
|
)
|
|
|
|
var errFlushRequest = errors.New("error flush history to store")
|
|
|
|
// Dao dao.
|
|
type Dao struct {
|
|
conf *conf.Config
|
|
HTTPClient *bm.Client
|
|
URL string
|
|
info *hbase.Client
|
|
redis *redis.Pool
|
|
db *tidb.DB
|
|
longDB *tidb.DB
|
|
insertStmt *tidb.Stmts
|
|
businessesStmt *tidb.Stmts
|
|
allHisStmt *tidb.Stmts
|
|
delUserStmt *tidb.Stmts
|
|
BusinessesMap map[int64]*model.Business
|
|
BusinessNames map[string]*model.Business
|
|
}
|
|
|
|
// New new history dao and return.
|
|
func New(c *conf.Config) (dao *Dao) {
|
|
dao = &Dao{
|
|
conf: c,
|
|
redis: redis.NewPool(c.Redis),
|
|
HTTPClient: bm.NewClient(c.Job.Client),
|
|
URL: c.Job.URL,
|
|
info: hbase.NewClient(c.Info.Config),
|
|
db: tidb.NewTiDB(c.TiDB),
|
|
longDB: tidb.NewTiDB(c.LongTiDB),
|
|
}
|
|
dao.businessesStmt = dao.db.Prepared(_businessesSQL)
|
|
dao.insertStmt = dao.db.Prepared(_addHistorySQL)
|
|
dao.allHisStmt = dao.db.Prepared(_allHisSQL)
|
|
dao.delUserStmt = dao.db.Prepared(_delUserHisSQL)
|
|
dao.loadBusiness()
|
|
go dao.loadBusinessproc()
|
|
return
|
|
}
|
|
|
|
// Flush flush history to store by mids.
|
|
func (d *Dao) Flush(c context.Context, mids string, stime int64) (err error) {
|
|
params := url.Values{}
|
|
params.Set("mids", mids)
|
|
params.Set("time", fmt.Sprintf("%d", stime))
|
|
var res = &struct {
|
|
Code int `json:"code"`
|
|
Msg string `json:"message"`
|
|
}{}
|
|
if err = d.HTTPClient.Post(c, d.URL, "", params, res); err != nil {
|
|
log.Error("d.HTTPClient.Post(%s?%s) error(%v)", d.URL, params.Encode(), err)
|
|
return
|
|
}
|
|
if res.Code != 0 {
|
|
log.Error("d.HTTPClient.Post(%s?%s) code:%d msg:%s", d.URL, params.Encode(), res.Code, res.Msg)
|
|
err = errFlushRequest
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// Ping check connection success.
|
|
func (d *Dao) Ping(c context.Context) (err error) {
|
|
return
|
|
}
|
|
|
|
// Close close the redis and kafka resource.
|
|
func (d *Dao) Close() {
|
|
d.redis.Close()
|
|
d.db.Close()
|
|
d.longDB.Close()
|
|
}
|
|
|
|
func (d *Dao) loadBusiness() {
|
|
var business []*model.Business
|
|
var err error
|
|
businessMap := make(map[string]*model.Business)
|
|
businessIDMap := make(map[int64]*model.Business)
|
|
for {
|
|
if business, err = d.Businesses(context.TODO()); err != nil {
|
|
time.Sleep(time.Second)
|
|
continue
|
|
}
|
|
for _, b := range business {
|
|
businessMap[b.Name] = b
|
|
businessIDMap[b.ID] = b
|
|
}
|
|
d.BusinessNames = businessMap
|
|
d.BusinessesMap = businessIDMap
|
|
return
|
|
}
|
|
}
|
|
|
|
func (d *Dao) loadBusinessproc() {
|
|
for {
|
|
time.Sleep(time.Minute * 5)
|
|
d.loadBusiness()
|
|
}
|
|
}
|