package service import ( "fmt" "log" "os" "reflect" "strings" "sync" "time" ) type MethodInfo struct { Fun reflect.Value ParamList []reflect.Value types reflect.Type } type IModule interface { SetModuleType(moduleType uint32) GetModuleType() uint32 DynamicRun(module IModule) RunModule(module IModule, exit chan bool, pwaitGroup *sync.WaitGroup) error InitModule(module IModule) error OnInit() error OnRun() bool OnEndRun() AddModule(module IModule) bool GetModuleByType(moduleType uint32) IModule GetOwnerService() IService SetOwnerService(iservice IService) } type IService interface { Init(Iservice IService, servicetype int) error OnInit() error OnEndInit() error OnRun() bool 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 := "system-" + time.Now().Format("2006-01-02") + ".log" var err error logFile, err = os.Create(fileName) if err != nil { log.Fatalln("open file error") } Log = log.New(logFile, "", log.Lshortfile|log.LstdFlags) } type BaseService struct { BaseModule serviceid int servicename string servicetype int Status int } type BaseModule struct { moduleType uint32 mapModule map[uint32]IModule ownerService IService tickTime int64 ExitChan chan bool WaitGroup *sync.WaitGroup } 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 IService, servicetype int) error { slf.ownerService = iservice slf.servicename = fmt.Sprintf("%T", iservice) parts := strings.Split(slf.servicename, ".") if len(parts) != 2 { GetLogger().Printf(LEVER_ERROR, "BaseService.Init: service name is error: %q", slf.servicename) 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) 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 } func (slf *BaseModule) AddModule(module IModule) bool { if module.GetModuleType() == 0 { return false } module.SetOwnerService(slf.ownerService) if slf.mapModule == nil { slf.mapModule = make(map[uint32]IModule) } _, ok := slf.mapModule[module.GetModuleType()] if ok == true { return false } slf.mapModule[module.GetModuleType()] = module return true } func (slf *BaseModule) GetModuleByType(moduleType uint32) IModule { 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() bool { return false } func (slf *BaseModule) OnEndRun() { } func (slf *BaseModule) GetOwnerService() IService { return slf.ownerService } func (slf *BaseModule) SetOwnerService(iservice IService) { slf.ownerService = iservice } func (slf *BaseModule) InitModule(module IModule) error { module.OnInit() for _, subModule := range slf.mapModule { go subModule.OnInit() } return nil } func (slf *BaseModule) DynamicRun(module IModule) { module.InitModule(module) module.RunModule(module, slf.ExitChan, slf.WaitGroup) } func (slf *BaseModule) RunModule(module IModule, exit chan bool, pwaitGroup *sync.WaitGroup) error { slf.ExitChan = exit slf.WaitGroup = pwaitGroup //运行所有子模块 for _, subModule := range slf.mapModule { go subModule.RunModule(subModule, exit, pwaitGroup) } pwaitGroup.Add(1) defer pwaitGroup.Done() for { select { case <-exit: GetLogger().Printf(LEVER_WARN, "stopping module %s...", fmt.Sprintf("%T", slf)) fmt.Println("stopping module %s...", fmt.Sprintf("%T", slf)) return nil default: } if module.OnRun() == false { break } slf.tickTime = time.Now().UnixNano() / 1e6 } module.OnEndRun() return nil }