fix
zhangqian
2023-12-01 8324f872ef3a4d0c978a9b1d062800c6a1701c12
main.go
@@ -2,6 +2,7 @@
import (
   "apsClient/conf"
   "apsClient/constvar"
   "apsClient/crontask"
   "apsClient/model"
   "apsClient/nsq"
@@ -9,9 +10,11 @@
   "apsClient/pkg/sqlitex"
   "apsClient/router"
   "apsClient/serf"
   "apsClient/service/plc_address"
   "apsClient/service"
   "fmt"
   "log"
   "net/http"
   _ "net/http/pprof"
   "time"
)
@@ -26,34 +29,63 @@
   }
   //加载plc写入地址
   plc_address.LoadAddressFromFile()
   //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)
   <-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()
      if err := crontask.StartTask(); err != nil {
         logx.Errorf("crontab task 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...")
@@ -67,21 +99,37 @@
}
func serfClusterEvent(stat int) {
   ChangeClusterStatus(stat)
   switch stat {
   case serf.EventCreateCluster, serf.EventSlave2Master, serf.EventLeaveCluster:
      if err := nsq.Init(); err != nil {
      if err := nsq.Init(); err != nil { //开启nsq
         logx.Errorf("nsq Init err:%v", err)
         return
      }
      crontask.Once()
      if err := crontask.StartTask(); err != nil {
      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()
      crontask.StopTask()
      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
   }
}