Files
origin/service/servicemanager.go

133 lines
2.6 KiB
Go

package service
import (
"os"
"sync"
)
type IServiceManager interface {
Setup(s IService) bool
Init(logger ILogger) bool
Start() bool
CreateServiceID() int
}
type CServiceManager struct {
genserviceid int
localserviceMap map[string]IService
logger ILogger
orderLocalService []string
}
func (slf *CServiceManager) Setup(s IService) bool {
s.(IModule).SetOwnerService(s)
s.(IModule).SetOwner(s.(IModule))
s.(IModule).SetSelf(s.(IModule))
slf.localserviceMap[s.GetServiceName()] = s
slf.orderLocalService = append(slf.orderLocalService, s.GetServiceName())
//通知其他服务已经安装
for _, is := range slf.localserviceMap {
//
is.OnSetupService(s)
s.OnSetupService(is)
}
return true
}
func (slf *CServiceManager) FindService(serviceName string) IService {
service, ok := slf.localserviceMap[serviceName]
if ok {
return service
}
return nil
}
type FetchService func(s IService) error
func (slf *CServiceManager) FetchService(s FetchService) IService {
for _, se := range slf.localserviceMap {
s(se)
}
return nil
}
func (slf *CServiceManager) Init(logger ILogger, exit chan bool, pwaitGroup *sync.WaitGroup) bool {
slf.logger = logger
for _, s := range slf.localserviceMap {
err := (s.(IModule)).InitModule(exit, pwaitGroup)
if err != nil {
slf.logger.Print(LEVER_FATAL, err)
return false
}
}
return true
}
func (slf *CServiceManager) Start() bool {
for _, sname := range slf.orderLocalService {
s := slf.FindService(sname)
GetLogger().Printf(LEVER_INFO, "Start Init module %T.", s.(IModule))
err := s.(IModule).OnInit()
if err != nil {
GetLogger().Printf(LEVER_ERROR, "Init module %T id is %d is fail,reason:%v...", s.(IModule), s.(IModule).GetModuleId(), err)
os.Exit(-1)
}
s.(IModule).getBaseModule().OnInit()
GetLogger().Printf(LEVER_INFO, "End Init module %T.", s.(IModule))
}
for _, sname := range slf.orderLocalService {
s := slf.FindService(sname)
go (s.(IModule)).RunModule(s.(IModule))
}
return true
}
func (slf *CServiceManager) GenServiceID() int {
slf.genserviceid += 1
return slf.genserviceid
}
func (slf *CServiceManager) GetLogger() ILogger {
ret := slf.logger
if ret == nil {
ret = defaultLogger
}
return ret
}
var self *CServiceManager
func InstanceServiceMgr() *CServiceManager {
if self == nil {
self = new(CServiceManager)
self.localserviceMap = make(map[string]IService)
return self
}
return self
}
func GetLogger() ILogger {
return InstanceServiceMgr().GetLogger()
}
func (slf *CServiceManager) IsFinishInit() bool {
for _, val := range slf.localserviceMap {
if val.IsInit() == false {
return false
}
}
return true
}