| | |
| | | |
| | | import ( |
| | | "apsClient/conf" |
| | | "apsClient/constvar" |
| | | "apsClient/crontask" |
| | | "apsClient/model" |
| | | "apsClient/nsq" |
| | | "apsClient/pkg/logx" |
| | | "apsClient/pkg/sqlitex" |
| | | "apsClient/router" |
| | | "apsClient/service/plc_address" |
| | | "apsClient/serf" |
| | | "apsClient/service" |
| | | "fmt" |
| | | "log" |
| | | "net/http" |
| | | "os" |
| | | "os/signal" |
| | | "syscall" |
| | | _ "net/http/pprof" |
| | | "time" |
| | | ) |
| | | |
| | |
| | | return |
| | | } |
| | | |
| | | if err := nsq.Init(); err != nil { |
| | | logx.Errorf("nsq Init err:%v", err) |
| | | //加载plc写入地址 |
| | | //plc_address.LoadAddressFromFile() |
| | | |
| | | // 启动数据同步 |
| | | var serfStartChan = make(chan bool) |
| | | |
| | | // 需要同步的表 |
| | | var syncTables = []string{ |
| | | "procedures", |
| | | "process_model", |
| | | "production_progress", |
| | | "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 |
| | | } |
| | | |
| | | if err := crontask.InitTask(); err != nil { |
| | | //从文件里读取当前生产设备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 |
| | | } |
| | | //加载plc写入地址 |
| | | plc_address.LoadAddressFromFile() |
| | | |
| | | ////提前加载任务 |
| | | //service.NewTaskService().GetTask() |
| | | |
| | | go shutdown() |
| | | logx.Infof("apsClient start serve...") |
| | | server := &http.Server{ |
| | | Addr: fmt.Sprintf(":%d", conf.Conf.System.Port), |
| | |
| | | logx.Error(server.ListenAndServe().Error()) |
| | | } |
| | | |
| | | func shutdown() { |
| | | quit := make(chan os.Signal, 1) |
| | | signal.Notify(quit, syscall.SIGKILL, syscall.SIGQUIT, syscall.SIGINT, syscall.SIGTERM) |
| | | <-quit |
| | | 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("apsClient exited...") |
| | | os.Exit(0) |
| | | 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 |
| | | } |
| | | } |