package service import ( "fmt" "log" "os" "reflect" "strings" "sync" "time" ) type MethodInfo struct { Fun reflect.Value ParamList []reflect.Value types reflect.Type } type IBaseModule interface { SetModuleType(moduleType uint32) GetModuleType() uint32 OnInit() error OnRun() error AddModule(module IBaseModule) bool GetModuleByType(moduleType uint32) IBaseModule } type IService interface { Init(Iservice interface{}, servicetype int) error Run(service IService, exit chan bool, pwaitGroup *sync.WaitGroup) error OnInit() error OnEndInit() error OnRun() error OnRunLoop() error OnDestory() error OnFetchService(iservice IService) error OnSetupService(iservice IService) //其他服务被安装 OnRemoveService(iservice IService) //其他服务被安装 GetServiceType() int GetServiceName() string SetServiceName(serviceName string) bool GetServiceId() int IsTimeOutTick(microSecond int64) bool GetStatus() int } var Log *log.Logger var logFile *os.File func InitLog() { fileName := "log.log" var err error logFile, err = os.Create(fileName) if err != nil { log.Fatalln("open file error") } Log = log.New(logFile, "", log.LstdFlags) } type BaseService struct { BaseModule serviceid int servicename string servicetype int tickTime int64 statTm int64 Status int } type BaseModule struct { moduleType uint32 mapModule map[uint32]IBaseModule } func (slf *BaseService) GetServiceId() int { return slf.serviceid } func (slf *BaseService) GetServiceType() int { return slf.servicetype } func (slf *BaseService) GetServiceName() string { return slf.servicename } func (slf *BaseService) SetServiceName(serviceName string) bool { slf.servicename = serviceName return true } func (slf *BaseService) GetStatus() int { return slf.Status } func (slf *BaseService) OnEndInit() error { return nil } func (slf *BaseService) OnFetchService(iservice IService) error { return nil } func (slf *BaseService) OnSetupService(iservice IService) { return } func (slf *BaseService) OnRemoveService(iservice IService) { return } func (slf *BaseService) Init(Iservice interface{}, servicetype int) error { slf.servicename = fmt.Sprintf("%T", Iservice) parts := strings.Split(slf.servicename, ".") if len(parts) != 2 { err := fmt.Errorf("BaseService.Init: service name is error: %q", slf.servicename) return err } slf.servicename = parts[1] slf.servicetype = servicetype slf.serviceid = InstanceServiceMgr().GenServiceID() return nil } func (slf *BaseService) OnRunLoop() error { return fmt.Errorf("None Loop") } func (slf *BaseService) Run(service IService, exit chan bool, pwaitGroup *sync.WaitGroup) error { defer pwaitGroup.Done() service.OnRun() for { select { case <-exit: fmt.Println("stopping...") return nil default: } slf.tickTime = time.Now().UnixNano() / 1e6 if service.OnRunLoop() != nil { break } slf.tickTime = time.Now().UnixNano() / 1e6 } return nil } func (slf *BaseService) RPC_CheckServiceTickTimeOut(microSecond int64) error { if slf.IsTimeOutTick(microSecond) == true { Log.Printf("service:%s is timeout,state:%d", slf.GetServiceName(), slf.GetStatus()) } return nil } func (slf *BaseService) IsTimeOutTick(microSecond int64) bool { nowtm := time.Now().UnixNano() / 1e6 return nowtm-slf.tickTime >= microSecond } func (slf *BaseModule) SetModuleType(moduleType uint32) { slf.moduleType = moduleType } func (slf *BaseModule) GetModuleType() uint32 { return slf.moduleType } //OnInit() error //OnRun() error func (slf *BaseModule) AddModule(module IBaseModule) bool { if module.GetModuleType() == 0 { return false } if slf.mapModule == nil { slf.mapModule = make(map[uint32]IBaseModule) } _, ok := slf.mapModule[module.GetModuleType()] if ok == true { return false } slf.mapModule[module.GetModuleType()] = module return true } func (slf *BaseModule) GetModuleByType(moduleType uint32) IBaseModule { ret, ok := slf.mapModule[moduleType] if ok == false { return nil } return ret } func (slf *BaseModule) OnInit() error { return fmt.Errorf("not implement OnInit moduletype %d ", slf.GetModuleType()) } func (slf *BaseModule) OnRun() error { return fmt.Errorf("not implement OnRun moduletype %d ", slf.GetModuleType()) }