diff --git a/server/multiple.go b/server/multiple.go index 7f58b15..c9fdf0a 100644 --- a/server/multiple.go +++ b/server/multiple.go @@ -28,8 +28,10 @@ type MultipleServer struct { func (slf *MultipleServer) Run() { var exceptionChannel = make(chan error, 1) var runtimeExceptionChannel = make(chan error, 1) - defer close(exceptionChannel) - defer close(runtimeExceptionChannel) + defer func() { + close(exceptionChannel) + close(runtimeExceptionChannel) + }() var running = make([]*Server, 0, len(slf.servers)) for i := 0; i < len(slf.servers); i++ { go func(address string, server *Server) { @@ -73,6 +75,7 @@ func (slf *MultipleServer) Run() { case <-systemSignal: for len(slf.servers) > 0 { server := slf.servers[0] + server.multipleRuntimeErrorChan = nil server.Shutdown(nil) slf.servers = slf.servers[1:] } diff --git a/server/server.go b/server/server.go index 2a4c3bb..aa72a0d 100644 --- a/server/server.go +++ b/server/server.go @@ -120,7 +120,7 @@ func (slf *Server) Run(addr string) error { for i := 0; i < slf.core; i++ { slf.messageChannel[i] = make(chan *Message, 4096*1000) } - if slf.network != NetworkHttp && slf.network != NetworkWebsocket { + if slf.network != NetworkHttp && slf.network != NetworkWebsocket && slf.network != NetworkGRPC { slf.gServer = &gNet{Server: slf} } if callback != nil { @@ -142,6 +142,7 @@ func (slf *Server) Run(addr string) error { if err != nil { return err } + go connectionInitHandle(nil) go func() { slf.isRunning = true slf.OnStartBeforeEvent() @@ -208,13 +209,14 @@ func (slf *Server) Run(addr string) error { slf.isRunning = true slf.OnStartBeforeEvent() slf.httpServer.Addr = slf.addr + go connectionInitHandle(nil) if len(slf.certFile)+len(slf.keyFile) > 0 { if err := slf.httpServer.ListenAndServeTLS(slf.certFile, slf.keyFile); err != nil { slf.isRunning = false slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown) } } else { - if err := slf.httpServer.ListenAndServe(); err != nil { + if err := slf.httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed { slf.isRunning = false slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown) } @@ -432,6 +434,9 @@ func (slf *Server) HttpRouter() gin.IRouter { // PushMessage 向服务器中写入特定类型的消息,需严格遵守消息属性要求 func (slf *Server) PushMessage(messageType MessageType, attrs ...any) { + if slf.messagePool.IsClose() { + return + } msg := slf.messagePool.Get() msg.t = messageType msg.attrs = attrs diff --git a/utils/synchronization/pool.go b/utils/synchronization/pool.go index 8749f6b..e8a9da4 100644 --- a/utils/synchronization/pool.go +++ b/utils/synchronization/pool.go @@ -48,6 +48,10 @@ func (slf *Pool[T]) Get() T { return slf.generator() } +func (slf *Pool[T]) IsClose() bool { + return slf.generator == nil +} + func (slf *Pool[T]) Release(data T) { slf.releaser(data) slf.put(data)