fix: 修复 server.Multiple 关闭服务器空指针异常

This commit is contained in:
kercylan98 2023-07-03 13:12:22 +08:00
parent 5f8cc1341e
commit 1136af4dd8
3 changed files with 16 additions and 4 deletions

View File

@ -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:]
}

View File

@ -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

View File

@ -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)