mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-04 06:54:45 +08:00
206 lines
4.0 KiB
Go
206 lines
4.0 KiB
Go
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 {
|
|
SetModuleName(modulename string) bool
|
|
GetModuleName() string
|
|
OnInit() error
|
|
OnRun() error
|
|
}
|
|
|
|
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
|
|
|
|
AddModule(module IBaseModule, autorun bool) bool
|
|
GetModule(module string) IBaseModule
|
|
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 {
|
|
serviceid int
|
|
servicename string
|
|
servicetype int
|
|
|
|
tickTime int64
|
|
statTm int64
|
|
Status int
|
|
|
|
modulelist []IBaseModule
|
|
}
|
|
|
|
type BaseModule struct {
|
|
modulename string
|
|
}
|
|
|
|
func (slf *BaseModule) SetModuleName(modulename string) bool {
|
|
slf.modulename = modulename
|
|
return true
|
|
}
|
|
|
|
func (slf *BaseModule) GetModuleName() string {
|
|
return slf.modulename
|
|
}
|
|
|
|
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 *BaseService) AddModule(module IBaseModule, autorun bool) bool {
|
|
typename := fmt.Sprintf("%v", reflect.TypeOf(module))
|
|
parts := strings.Split(typename, ".")
|
|
if len(parts) < 2 {
|
|
return false
|
|
}
|
|
module.SetModuleName(parts[1])
|
|
slf.modulelist = append(slf.modulelist, module)
|
|
module.OnInit()
|
|
if autorun == true {
|
|
go module.OnRun()
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func (slf *BaseService) GetModule(module string) IBaseModule {
|
|
for _, v := range slf.modulelist {
|
|
if v.GetModuleName() == module {
|
|
return v
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|