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 } }