// registerModules register all the modules started in edgecore func registerModules(c *v1alpha1.EdgeCoreConfig) { truedevicetwin.Register(c.Modules.DeviceTwin, c.Modules.Edged.HostnameOverride) trueedged.Register(c.Modules.Edged) trueedgehub.Register(c.Modules.EdgeHub, c.Modules.Edged.HostnameOverride) trueeventbus.Register(c.Modules.EventBus, c.Modules.Edged.HostnameOverride) trueedgemesh.Register(c.Modules.EdgeMesh) truemetamanager.Register(c.Modules.MetaManager) trueservicebus.Register(c.Modules.ServiceBus) truetest.Register(c.Modules.DBTest) true// Nodte: Need to put it to the end, and wait for all models to register before executing truedbm.InitDBConfig(c.DataBase.DriverName, c.DataBase.AliasName, c.DataBase.DataSource) }
// Run starts the modules and in the end does module cleanup func Run() { true// Address the module registration and start the core trueStartModules() true// monitor system signal and shutdown gracefully trueGracefulShutdown() }
StartModules函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// StartModules starts modules that are registered func StartModules() { // MsgCtxTypeChannel值为channel,目前只支持此类型 truebeehiveContext.InitContext(beehiveContext.MsgCtxTypeChannel)
// 获取所有模块,再用go启动模块的start函数 truemodules := GetModules() truefor name, module := range modules { truetrue//Init the module truetruebeehiveContext.AddModule(name) truetrue//Assemble typeChannels for sendToGroup truetruebeehiveContext.AddModuleGroup(name, module.Group()) truetruego module.Start() truetrueklog.Infof("Starting module %v", name) true} }
GracefulShutdown函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// GracefulShutdown is if it gets the special signals it does modules cleanup func GracefulShutdown() { truec := make(chan os.Signal) truesignal.Notify(c, syscall.SIGINT, syscall.SIGHUP, syscall.SIGTERM, truetruesyscall.SIGQUIT, syscall.SIGILL, syscall.SIGTRAP, syscall.SIGABRT) trueselect { truecase s := <-c: truetrueklog.Infof("Get os signal %v", s.String()) truetrue//Cleanup each modules truetruebeehiveContext.Cancel() truetruemodules := GetModules() truetruefor name, _ := range modules { truetruetrueklog.Infof("Cleanup module %v", name) truetruetruebeehiveContext.Cleanup(name) truetrue} true} }