From 1136af4dd87552970eb45594ddcb48ffde0c0a91 Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Mon, 3 Jul 2023 13:12:22 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20server.Multiple=20?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E6=9C=8D=E5=8A=A1=E5=99=A8=E7=A9=BA=E6=8C=87?= =?UTF-8?q?=E9=92=88=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/multiple.go | 7 +++++-- server/server.go | 9 +++++++-- utils/synchronization/pool.go | 4 ++++ 3 files changed, 16 insertions(+), 4 deletions(-) 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)