Compare commits

...

5 Commits

Author SHA1 Message Date
orgin
be3daf19f9 优化服务配置获取函数 2022-06-09 17:44:42 +08:00
orgin
aa91c7bf1b Merge pull request #860 from cgc1983/master
module exit error
2022-06-09 11:52:50 +08:00
cgc1983
7fe73e55fb module exit error 2022-06-09 11:32:25 +08:00
cgc1983
e5ceaa9e76 ignore macosx 2022-06-02 17:51:03 +08:00
orgin
97c55ada71 优化网络连接Id生成规则 2022-06-02 17:07:01 +08:00
4 changed files with 76 additions and 84 deletions

1
.gitignore vendored
View File

@@ -10,3 +10,4 @@
# Output of the go coverage tool, specifically when used with LiteIDE # Output of the go coverage tool, specifically when used with LiteIDE
*.out *.out
.DS_Store

View File

@@ -244,15 +244,6 @@ func (cls *Cluster) GetNodeIdByService(serviceName string, rpcClientList []*rpc.
return nil, count return nil, count
} }
func (cls *Cluster) getServiceCfg(serviceName string) interface{} {
v, ok := cls.localServiceCfg[serviceName]
if ok == false {
return nil
}
return v
}
func (cls *Cluster) GetServiceCfg(serviceName string) interface{} { func (cls *Cluster) GetServiceCfg(serviceName string) interface{} {
serviceCfg, ok := cls.localServiceCfg[serviceName] serviceCfg, ok := cls.localServiceCfg[serviceName]
if ok == false { if ok == false {

View File

@@ -2,31 +2,33 @@ package service
import ( import (
"fmt" "fmt"
"reflect"
"sync/atomic"
"time"
"github.com/duanhf2012/origin/event" "github.com/duanhf2012/origin/event"
"github.com/duanhf2012/origin/log" "github.com/duanhf2012/origin/log"
rpcHandle "github.com/duanhf2012/origin/rpc" rpcHandle "github.com/duanhf2012/origin/rpc"
"github.com/duanhf2012/origin/util/timer" "github.com/duanhf2012/origin/util/timer"
"reflect"
"sync/atomic"
"time"
) )
const InitModuleId = 1e9 const InitModuleId = 1e9
type IModule interface { type IModule interface {
SetModuleId(moduleId uint32) bool SetModuleId(moduleId uint32) bool
GetModuleId() uint32 GetModuleId() uint32
AddModule(module IModule) (uint32,error) AddModule(module IModule) (uint32, error)
GetModule(moduleId uint32) IModule GetModule(moduleId uint32) IModule
GetAncestor()IModule GetAncestor() IModule
ReleaseModule(moduleId uint32) ReleaseModule(moduleId uint32)
NewModuleId() uint32 NewModuleId() uint32
GetParent()IModule GetParent() IModule
OnInit() error OnInit() error
OnRelease() OnRelease()
getBaseModule() IModule getBaseModule() IModule
GetService() IService GetService() IService
GetModuleName() string GetModuleName() string
GetEventProcessor()event.IEventProcessor GetEventProcessor() event.IEventProcessor
NotifyEvent(ev event.IEvent) NotifyEvent(ev event.IEvent)
} }
@@ -38,25 +40,25 @@ type IModuleTimer interface {
type Module struct { type Module struct {
rpcHandle.IRpcHandler rpcHandle.IRpcHandler
moduleId uint32 //模块Id moduleId uint32 //模块Id
moduleName string //模块名称 moduleName string //模块名称
parent IModule //父亲 parent IModule //父亲
self IModule //自己 self IModule //自己
child map[uint32]IModule //孩子们 child map[uint32]IModule //孩子们
mapActiveTimer map[timer.ITimer]struct{} mapActiveTimer map[timer.ITimer]struct{}
mapActiveIdTimer map[uint64]timer.ITimer mapActiveIdTimer map[uint64]timer.ITimer
dispatcher *timer.Dispatcher //timer dispatcher *timer.Dispatcher //timer
//根结点 //根结点
ancestor IModule //始祖 ancestor IModule //始祖
seedModuleId uint32 //模块id种子 seedModuleId uint32 //模块id种子
descendants map[uint32]IModule //始祖的后裔们 descendants map[uint32]IModule //始祖的后裔们
//事件管道 //事件管道
eventHandler event.IEventHandler eventHandler event.IEventHandler
} }
func (m *Module) SetModuleId(moduleId uint32) bool{ func (m *Module) SetModuleId(moduleId uint32) bool {
if m.moduleId > 0 { if m.moduleId > 0 {
return false return false
} }
@@ -65,35 +67,35 @@ func (m *Module) SetModuleId(moduleId uint32) bool{
return true return true
} }
func (m *Module) GetModuleId() uint32{ func (m *Module) GetModuleId() uint32 {
return m.moduleId return m.moduleId
} }
func (m *Module) GetModuleName() string{ func (m *Module) GetModuleName() string {
return m.moduleName return m.moduleName
} }
func (m *Module) OnInit() error{ func (m *Module) OnInit() error {
return nil return nil
} }
func (m *Module) AddModule(module IModule) (uint32,error){ func (m *Module) AddModule(module IModule) (uint32, error) {
//没有事件处理器不允许加入其他模块 //没有事件处理器不允许加入其他模块
if m.GetEventProcessor() == nil { if m.GetEventProcessor() == nil {
return 0,fmt.Errorf("module %+v Event Processor is nil", m.self) return 0, fmt.Errorf("module %+v Event Processor is nil", m.self)
} }
pAddModule := module.getBaseModule().(*Module) pAddModule := module.getBaseModule().(*Module)
if pAddModule.GetModuleId()==0 { if pAddModule.GetModuleId() == 0 {
pAddModule.moduleId = m.NewModuleId() pAddModule.moduleId = m.NewModuleId()
} }
if m.child == nil { if m.child == nil {
m.child = map[uint32]IModule{} m.child = map[uint32]IModule{}
} }
_,ok := m.child[module.GetModuleId()] _, ok := m.child[module.GetModuleId()]
if ok == true { if ok == true {
return 0,fmt.Errorf("exists module id %d",module.GetModuleId()) return 0, fmt.Errorf("exists module id %d", module.GetModuleId())
} }
pAddModule.IRpcHandler = m.IRpcHandler pAddModule.IRpcHandler = m.IRpcHandler
pAddModule.self = module pAddModule.self = module
@@ -105,17 +107,17 @@ func (m *Module) AddModule(module IModule) (uint32,error){
pAddModule.eventHandler.Init(m.eventHandler.GetEventProcessor()) pAddModule.eventHandler.Init(m.eventHandler.GetEventProcessor())
err := module.OnInit() err := module.OnInit()
if err != nil { if err != nil {
return 0,err return 0, err
} }
m.child[module.GetModuleId()] = module m.child[module.GetModuleId()] = module
m.ancestor.getBaseModule().(*Module).descendants[module.GetModuleId()] = module m.ancestor.getBaseModule().(*Module).descendants[module.GetModuleId()] = module
log.SDebug("Add module ",module.GetModuleName()," completed") log.SDebug("Add module ", module.GetModuleName(), " completed")
return module.GetModuleId(),nil return module.GetModuleId(), nil
} }
func (m *Module) ReleaseModule(moduleId uint32){ func (m *Module) ReleaseModule(moduleId uint32) {
pModule := m.GetModule(moduleId).getBaseModule().(*Module) pModule := m.GetModule(moduleId).getBaseModule().(*Module)
//释放子孙 //释放子孙
@@ -123,19 +125,19 @@ func (m *Module) ReleaseModule(moduleId uint32){
m.ReleaseModule(id) m.ReleaseModule(id)
} }
pModule.GetEventHandler().Destroy()
pModule.self.OnRelease() pModule.self.OnRelease()
pModule.GetEventHandler().Destroy()
log.SDebug("Release module ", pModule.GetModuleName()) log.SDebug("Release module ", pModule.GetModuleName())
for pTimer := range pModule.mapActiveTimer { for pTimer := range pModule.mapActiveTimer {
pTimer.Cancel() pTimer.Cancel()
} }
for _,t := range pModule.mapActiveIdTimer { for _, t := range pModule.mapActiveIdTimer {
t.Cancel() t.Cancel()
} }
delete(m.child,moduleId) delete(m.child, moduleId)
delete (m.ancestor.getBaseModule().(*Module).descendants,moduleId) delete(m.ancestor.getBaseModule().(*Module).descendants, moduleId)
//清理被删除的Module //清理被删除的Module
pModule.self = nil pModule.self = nil
@@ -149,16 +151,17 @@ func (m *Module) ReleaseModule(moduleId uint32){
pModule.mapActiveIdTimer = nil pModule.mapActiveIdTimer = nil
} }
func (m *Module) NewModuleId() uint32{ func (m *Module) NewModuleId() uint32 {
m.ancestor.getBaseModule().(*Module).seedModuleId+=1 m.ancestor.getBaseModule().(*Module).seedModuleId += 1
return m.ancestor.getBaseModule().(*Module).seedModuleId return m.ancestor.getBaseModule().(*Module).seedModuleId
} }
var timerSeedId uint32 var timerSeedId uint32
func (m *Module) GenTimerId() uint64{
for{ func (m *Module) GenTimerId() uint64 {
newTimerId := (uint64(m.GetModuleId())<<32)|uint64(atomic.AddUint32(&timerSeedId,1)) for {
if _,ok := m.mapActiveIdTimer[newTimerId];ok == true { newTimerId := (uint64(m.GetModuleId()) << 32) | uint64(atomic.AddUint32(&timerSeedId, 1))
if _, ok := m.mapActiveIdTimer[newTimerId]; ok == true {
continue continue
} }
@@ -166,33 +169,32 @@ func (m *Module) GenTimerId() uint64{
} }
} }
func (m *Module) GetAncestor() IModule {
func (m *Module) GetAncestor()IModule{
return m.ancestor return m.ancestor
} }
func (m *Module) GetModule(moduleId uint32) IModule{ func (m *Module) GetModule(moduleId uint32) IModule {
iModule,ok := m.GetAncestor().getBaseModule().(*Module).descendants[moduleId] iModule, ok := m.GetAncestor().getBaseModule().(*Module).descendants[moduleId]
if ok == false { if ok == false {
return nil return nil
} }
return iModule return iModule
} }
func (m *Module) getBaseModule() IModule{ func (m *Module) getBaseModule() IModule {
return m return m
} }
func (m *Module) GetParent()IModule{ func (m *Module) GetParent() IModule {
return m.parent return m.parent
} }
func (m *Module) OnCloseTimer(t timer.ITimer){ func (m *Module) OnCloseTimer(t timer.ITimer) {
delete(m.mapActiveIdTimer,t.GetId()) delete(m.mapActiveIdTimer, t.GetId())
delete(m.mapActiveTimer,t) delete(m.mapActiveTimer, t)
} }
func (m *Module) OnAddTimer(t timer.ITimer){ func (m *Module) OnAddTimer(t timer.ITimer) {
if t != nil { if t != nil {
if m.mapActiveTimer == nil { if m.mapActiveTimer == nil {
m.mapActiveTimer = map[timer.ITimer]struct{}{} m.mapActiveTimer = map[timer.ITimer]struct{}{}
@@ -204,33 +206,33 @@ func (m *Module) OnAddTimer(t timer.ITimer){
func (m *Module) AfterFunc(d time.Duration, cb func(*timer.Timer)) *timer.Timer { func (m *Module) AfterFunc(d time.Duration, cb func(*timer.Timer)) *timer.Timer {
if m.mapActiveTimer == nil { if m.mapActiveTimer == nil {
m.mapActiveTimer =map[timer.ITimer]struct{}{} m.mapActiveTimer = map[timer.ITimer]struct{}{}
} }
return m.dispatcher.AfterFunc(d,nil,cb,m.OnCloseTimer,m.OnAddTimer) return m.dispatcher.AfterFunc(d, nil, cb, m.OnCloseTimer, m.OnAddTimer)
} }
func (m *Module) CronFunc(cronExpr *timer.CronExpr, cb func(*timer.Cron)) *timer.Cron { func (m *Module) CronFunc(cronExpr *timer.CronExpr, cb func(*timer.Cron)) *timer.Cron {
if m.mapActiveTimer == nil { if m.mapActiveTimer == nil {
m.mapActiveTimer =map[timer.ITimer]struct{}{} m.mapActiveTimer = map[timer.ITimer]struct{}{}
} }
return m.dispatcher.CronFunc(cronExpr,nil,cb,m.OnCloseTimer,m.OnAddTimer) return m.dispatcher.CronFunc(cronExpr, nil, cb, m.OnCloseTimer, m.OnAddTimer)
} }
func (m *Module) NewTicker(d time.Duration, cb func(*timer.Ticker)) *timer.Ticker { func (m *Module) NewTicker(d time.Duration, cb func(*timer.Ticker)) *timer.Ticker {
if m.mapActiveTimer == nil { if m.mapActiveTimer == nil {
m.mapActiveTimer =map[timer.ITimer]struct{}{} m.mapActiveTimer = map[timer.ITimer]struct{}{}
} }
return m.dispatcher.TickerFunc(d,nil,cb,m.OnCloseTimer,m.OnAddTimer) return m.dispatcher.TickerFunc(d, nil, cb, m.OnCloseTimer, m.OnAddTimer)
} }
func (m *Module) cb(*timer.Timer){ func (m *Module) cb(*timer.Timer) {
} }
func (m *Module) SafeAfterFunc(timerId *uint64,d time.Duration, AdditionData interface{},cb func(uint64,interface{})) { func (m *Module) SafeAfterFunc(timerId *uint64, d time.Duration, AdditionData interface{}, cb func(uint64, interface{})) {
if m.mapActiveIdTimer == nil { if m.mapActiveIdTimer == nil {
m.mapActiveIdTimer = map[uint64]timer.ITimer{} m.mapActiveIdTimer = map[uint64]timer.ITimer{}
} }
@@ -240,45 +242,45 @@ func (m *Module) SafeAfterFunc(timerId *uint64,d time.Duration, AdditionData int
} }
*timerId = m.GenTimerId() *timerId = m.GenTimerId()
t := m.dispatcher.AfterFunc(d,cb,nil,m.OnCloseTimer,m.OnAddTimer) t := m.dispatcher.AfterFunc(d, cb, nil, m.OnCloseTimer, m.OnAddTimer)
t.AdditionData = AdditionData t.AdditionData = AdditionData
t.Id = *timerId t.Id = *timerId
m.mapActiveIdTimer[*timerId] = t m.mapActiveIdTimer[*timerId] = t
} }
func (m *Module) SafeCronFunc(cronId *uint64,cronExpr *timer.CronExpr, AdditionData interface{}, cb func(uint64,interface{})) { func (m *Module) SafeCronFunc(cronId *uint64, cronExpr *timer.CronExpr, AdditionData interface{}, cb func(uint64, interface{})) {
if m.mapActiveIdTimer == nil { if m.mapActiveIdTimer == nil {
m.mapActiveIdTimer = map[uint64]timer.ITimer{} m.mapActiveIdTimer = map[uint64]timer.ITimer{}
} }
*cronId = m.GenTimerId() *cronId = m.GenTimerId()
c := m.dispatcher.CronFunc(cronExpr,cb,nil,m.OnCloseTimer,m.OnAddTimer) c := m.dispatcher.CronFunc(cronExpr, cb, nil, m.OnCloseTimer, m.OnAddTimer)
c.AdditionData = AdditionData c.AdditionData = AdditionData
c.Id = *cronId c.Id = *cronId
m.mapActiveIdTimer[*cronId] = c m.mapActiveIdTimer[*cronId] = c
} }
func (m *Module) SafeNewTicker(tickerId *uint64,d time.Duration, AdditionData interface{}, cb func(uint64,interface{})) { func (m *Module) SafeNewTicker(tickerId *uint64, d time.Duration, AdditionData interface{}, cb func(uint64, interface{})) {
if m.mapActiveIdTimer == nil { if m.mapActiveIdTimer == nil {
m.mapActiveIdTimer = map[uint64]timer.ITimer{} m.mapActiveIdTimer = map[uint64]timer.ITimer{}
} }
*tickerId = m.GenTimerId() *tickerId = m.GenTimerId()
t := m.dispatcher.TickerFunc(d,cb,nil,m.OnCloseTimer,m.OnAddTimer) t := m.dispatcher.TickerFunc(d, cb, nil, m.OnCloseTimer, m.OnAddTimer)
t.AdditionData = AdditionData t.AdditionData = AdditionData
t.Id = *tickerId t.Id = *tickerId
m.mapActiveIdTimer[*tickerId] = t m.mapActiveIdTimer[*tickerId] = t
} }
func (m *Module) CancelTimerId(timerId *uint64) bool{ func (m *Module) CancelTimerId(timerId *uint64) bool {
if m.mapActiveIdTimer == nil { if m.mapActiveIdTimer == nil {
log.SError("mapActiveIdTimer is nil") log.SError("mapActiveIdTimer is nil")
return false return false
} }
t,ok := m.mapActiveIdTimer[*timerId] t, ok := m.mapActiveIdTimer[*timerId]
if ok == false { if ok == false {
log.SError("cannot find timer id ",timerId) log.SError("cannot find timer id ", timerId)
return false return false
} }
@@ -287,23 +289,21 @@ func (m *Module) CancelTimerId(timerId *uint64) bool{
return true return true
} }
func (m *Module) OnRelease() {
func (m *Module) OnRelease(){
} }
func (m *Module) GetService() IService { func (m *Module) GetService() IService {
return m.GetAncestor().(IService) return m.GetAncestor().(IService)
} }
func (m *Module) GetEventProcessor() event.IEventProcessor{ func (m *Module) GetEventProcessor() event.IEventProcessor {
return m.eventHandler.GetEventProcessor() return m.eventHandler.GetEventProcessor()
} }
func (m *Module) NotifyEvent(ev event.IEvent){ func (m *Module) NotifyEvent(ev event.IEvent) {
m.eventHandler.NotifyEvent(ev) m.eventHandler.NotifyEvent(ev)
} }
func (m *Module) GetEventHandler() event.IEventHandler{ func (m *Module) GetEventHandler() event.IEventHandler {
return m.eventHandler return m.eventHandler
} }

View File

@@ -74,7 +74,7 @@ func (tcpService *TcpService) genId() uint64 {
func GetNodeId(agentId uint64) int { func GetNodeId(agentId uint64) int {
return int(agentId>>54) return int(agentId>>50)
} }
func (tcpService *TcpService) OnInit() error{ func (tcpService *TcpService) OnInit() error{