package main
|
|
import (
|
"apsClient/conf"
|
"apsClient/constvar"
|
"apsClient/crontask"
|
"apsClient/model"
|
"apsClient/nsq"
|
"apsClient/pkg/logx"
|
"apsClient/pkg/sqlitex"
|
"apsClient/router"
|
"apsClient/serf"
|
"apsClient/service"
|
"fmt"
|
"log"
|
"net/http"
|
_ "net/http/pprof"
|
"time"
|
)
|
|
func main() {
|
|
logx.Init(conf.Conf.Log)
|
defer logx.Sync()
|
|
if err := model.Init(); err != nil {
|
logx.Errorf("model Init err:%v", err)
|
return
|
}
|
|
//加载plc写入地址
|
//plc_address.LoadAddressFromFile()
|
|
// 启动数据同步
|
var serfStartChan = make(chan bool)
|
|
// 需要同步的表
|
var syncTables = []string{
|
"procedures",
|
"process_model",
|
"work_order",
|
"task_status_sync",
|
"device",
|
"device_plc",
|
"system_status",
|
"process_model_plc_address",
|
"reports_to_cloud",
|
"report_work",
|
}
|
|
agent := serf.InitAgent("apsClient", syncTables, sqlitex.GetDB())
|
agent.RegisterClusterEvent(serfClusterEvent)
|
|
go agent.Serve(serfStartChan)
|
if !<-serfStartChan {
|
logx.Errorf("serf Init err, exit")
|
return
|
}
|
|
//从文件里读取当前生产设备id获取设备列表第一个
|
err := service.InitCurrentDeviceID(serf.Vasystem.ServerID)
|
if err != nil {
|
logx.Errorf("InitCurrentDeviceID error: %v, exit", err)
|
return
|
}
|
|
go func() {
|
service.ReportsSystemDeviceToCloud(serf.Vasystem.ServerID)
|
}()
|
|
// 判断当前集群状态
|
logx.Infof("current agent.ClusterStatus:%v", agent.ClusterStatus)
|
log.Println("current agent.ClusterStatus:", agent.ClusterStatus)
|
|
conf.Conf.SerfClusterStatus = agent.ClusterStatus
|
|
if agent.ClusterStatus != "slave" {
|
if err := nsq.Init(); err != nil {
|
logx.Errorf("nsq Init err:%v", err)
|
return
|
}
|
|
}
|
crontask.Once(agent.ClusterStatus != "slave")
|
if err := crontask.StartTask(agent.ClusterStatus != "slave"); err != nil {
|
logx.Errorf("crontab task Init err:%v", err)
|
return
|
}
|
|
logx.Infof("apsClient start serve...")
|
server := &http.Server{
|
Addr: fmt.Sprintf(":%d", conf.Conf.System.Port),
|
Handler: router.InitRouter(),
|
ReadTimeout: 5 * time.Second,
|
WriteTimeout: 5 * time.Second,
|
}
|
logx.Error(server.ListenAndServe().Error())
|
}
|
|
func serfClusterEvent(stat int) {
|
ChangeClusterStatus(stat)
|
switch stat {
|
case serf.EventCreateCluster, serf.EventSlave2Master, serf.EventLeaveCluster:
|
if err := nsq.Init(); err != nil { //开启nsq
|
logx.Errorf("nsq Init err:%v", err)
|
return
|
}
|
crontask.Once(true)
|
if err := crontask.RestartTask(true); err != nil { //以master方式重启task
|
logx.Errorf("crontab task Init err:%v", err)
|
return
|
}
|
case serf.EventJoinCluster, serf.EventMaster2Slave:
|
nsq.Stop() //关闭nsq
|
crontask.Once(false)
|
if err := crontask.RestartTask(false); err != nil { //以非master方式重启task
|
logx.Errorf("crontab task Init err:%v", err)
|
return
|
}
|
}
|
|
logx.Infof("serf cluster event: %v", stat)
|
}
|
|
func ChangeClusterStatus(stat int) {
|
switch stat {
|
case serf.EventSlave2Master, serf.EventCreateCluster:
|
conf.Conf.SerfClusterStatus = constvar.SerfClusterStatusMaster
|
case serf.EventLeaveCluster:
|
conf.Conf.SerfClusterStatus = constvar.SerfClusterStatusNull
|
case serf.EventJoinCluster, serf.EventMaster2Slave:
|
conf.Conf.SerfClusterStatus = constvar.SerfClusterStatusSlave
|
}
|
}
|