diff --git a/server/event.go b/server/event.go index a4a04ed..f0af527 100644 --- a/server/event.go +++ b/server/event.go @@ -7,17 +7,45 @@ import ( "reflect" ) +type ServerStartBeforeEventHandle func(srv *Server) +type ServerStartFinishEventHandle func(srv *Server) type ConnectionReceivePacketEventHandle func(conn *Conn, packet []byte) type ConnectionOpenedEventHandle func(conn *Conn) type ConnectionClosedEventHandle func(conn *Conn) type event struct { *Server + serverStartBeforeEventHandles []ServerStartBeforeEventHandle + serverStartFinishEventHandles []ServerStartFinishEventHandle connectionReceivePacketEventHandles []ConnectionReceivePacketEventHandle connectionOpenedEventHandles []ConnectionOpenedEventHandle connectionClosedEventHandles []ConnectionClosedEventHandle } +// RegServerStartBeforeEvent 在服务器初始化完成启动前立刻执行被注册的事件处理函数 +func (slf *event) RegServerStartBeforeEvent(handle ServerStartBeforeEventHandle) { + slf.serverStartBeforeEventHandles = append(slf.serverStartBeforeEventHandles, handle) + log.Info("Server", zap.String("RegEvent", runtimes.CurrentRunningFuncName()), zap.String("handle", reflect.TypeOf(handle).String())) +} + +func (slf *event) OnServerStartBeforeEvent() { + for _, handle := range slf.serverStartBeforeEventHandles { + handle(slf.Server) + } +} + +// RegServerStartFinishEvent 在服务器启动完成时将立刻执行被注册的事件处理函数 +func (slf *event) RegServerStartFinishEvent(handle ServerStartFinishEventHandle) { + slf.serverStartFinishEventHandles = append(slf.serverStartFinishEventHandles, handle) + log.Info("Server", zap.String("RegEvent", runtimes.CurrentRunningFuncName()), zap.String("handle", reflect.TypeOf(handle).String())) +} + +func (slf *event) OnServerStartFinishEvent() { + for _, handle := range slf.serverStartFinishEventHandles { + handle(slf.Server) + } +} + // RegConnectionClosedEvent 在连接关闭后将立刻执行被注册的事件处理函数 func (slf *event) RegConnectionClosedEvent(handle ConnectionClosedEventHandle) { if slf.network == NetworkHttp { diff --git a/server/multiple.go b/server/multiple.go index debaefc..57043c6 100644 --- a/server/multiple.go +++ b/server/multiple.go @@ -40,7 +40,7 @@ func (slf *MultipleServer) Run() { }(slf.addresses[i], slf.servers[i]) } - time.Sleep(time.Second) + time.Sleep(500 * time.Millisecond) log.Info("Server", zap.String("Minotaur Multiple Server", "====================================================================")) for _, server := range slf.servers { diff --git a/server/server.go b/server/server.go index 2c87fed..9cfb3d3 100644 --- a/server/server.go +++ b/server/server.go @@ -89,12 +89,14 @@ func (slf *Server) Run(addr string) error { } slf.grpcServer = grpc.NewServer() go func() { + slf.OnServerStartBeforeEvent() if err := slf.grpcServer.Serve(listener); err != nil { slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown) } }() case NetworkTCP, NetworkTCP4, NetworkTCP6, NetworkUdp, NetworkUdp4, NetworkUdp6, NetworkUnix: go connectionInitHandle(func() { + slf.OnServerStartBeforeEvent() if err := gnet.Serve(slf.gServer, protoAddr); err != nil { slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown) } @@ -105,6 +107,7 @@ func (slf *Server) Run(addr string) error { return err } go connectionInitHandle(func() { + slf.OnServerStartBeforeEvent() for { session, err := listener.AcceptKCP() if err != nil { @@ -138,6 +141,7 @@ func (slf *Server) Run(addr string) error { gin.SetMode(gin.ReleaseMode) } go func() { + slf.OnServerStartBeforeEvent() if err := slf.httpServer.Run(addr); err != nil { slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown) } @@ -195,6 +199,7 @@ func (slf *Server) Run(addr string) error { } }) go func() { + slf.OnServerStartBeforeEvent() if err := http.ListenAndServe(slf.addr, nil); err != nil { slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown) } @@ -204,19 +209,22 @@ func (slf *Server) Run(addr string) error { } if !slf.multiple { + time.Sleep(500 * time.Millisecond) log.Info("Server", zap.String("Minotaur Server", "====================================================================")) log.Info("Server", zap.String("Minotaur Server", "RunningInfo"), zap.Any("network", slf.network), zap.String("listen", slf.addr), ) log.Info("Server", zap.String("Minotaur Server", "====================================================================")) - + slf.OnServerStartFinishEvent() systemSignal := make(chan os.Signal, 1) signal.Notify(systemSignal, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT) select { case <-systemSignal: slf.Shutdown(nil) } + } else { + slf.OnServerStartFinishEvent() } return nil