fix: 修复 server.Multiple 关闭服务器空指针异常
This commit is contained in:
parent
5f8cc1341e
commit
1136af4dd8
|
@ -28,8 +28,10 @@ type MultipleServer struct {
|
||||||
func (slf *MultipleServer) Run() {
|
func (slf *MultipleServer) Run() {
|
||||||
var exceptionChannel = make(chan error, 1)
|
var exceptionChannel = make(chan error, 1)
|
||||||
var runtimeExceptionChannel = make(chan error, 1)
|
var runtimeExceptionChannel = make(chan error, 1)
|
||||||
defer close(exceptionChannel)
|
defer func() {
|
||||||
defer close(runtimeExceptionChannel)
|
close(exceptionChannel)
|
||||||
|
close(runtimeExceptionChannel)
|
||||||
|
}()
|
||||||
var running = make([]*Server, 0, len(slf.servers))
|
var running = make([]*Server, 0, len(slf.servers))
|
||||||
for i := 0; i < len(slf.servers); i++ {
|
for i := 0; i < len(slf.servers); i++ {
|
||||||
go func(address string, server *Server) {
|
go func(address string, server *Server) {
|
||||||
|
@ -73,6 +75,7 @@ func (slf *MultipleServer) Run() {
|
||||||
case <-systemSignal:
|
case <-systemSignal:
|
||||||
for len(slf.servers) > 0 {
|
for len(slf.servers) > 0 {
|
||||||
server := slf.servers[0]
|
server := slf.servers[0]
|
||||||
|
server.multipleRuntimeErrorChan = nil
|
||||||
server.Shutdown(nil)
|
server.Shutdown(nil)
|
||||||
slf.servers = slf.servers[1:]
|
slf.servers = slf.servers[1:]
|
||||||
}
|
}
|
||||||
|
|
|
@ -120,7 +120,7 @@ func (slf *Server) Run(addr string) error {
|
||||||
for i := 0; i < slf.core; i++ {
|
for i := 0; i < slf.core; i++ {
|
||||||
slf.messageChannel[i] = make(chan *Message, 4096*1000)
|
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}
|
slf.gServer = &gNet{Server: slf}
|
||||||
}
|
}
|
||||||
if callback != nil {
|
if callback != nil {
|
||||||
|
@ -142,6 +142,7 @@ func (slf *Server) Run(addr string) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
go connectionInitHandle(nil)
|
||||||
go func() {
|
go func() {
|
||||||
slf.isRunning = true
|
slf.isRunning = true
|
||||||
slf.OnStartBeforeEvent()
|
slf.OnStartBeforeEvent()
|
||||||
|
@ -208,13 +209,14 @@ func (slf *Server) Run(addr string) error {
|
||||||
slf.isRunning = true
|
slf.isRunning = true
|
||||||
slf.OnStartBeforeEvent()
|
slf.OnStartBeforeEvent()
|
||||||
slf.httpServer.Addr = slf.addr
|
slf.httpServer.Addr = slf.addr
|
||||||
|
go connectionInitHandle(nil)
|
||||||
if len(slf.certFile)+len(slf.keyFile) > 0 {
|
if len(slf.certFile)+len(slf.keyFile) > 0 {
|
||||||
if err := slf.httpServer.ListenAndServeTLS(slf.certFile, slf.keyFile); err != nil {
|
if err := slf.httpServer.ListenAndServeTLS(slf.certFile, slf.keyFile); err != nil {
|
||||||
slf.isRunning = false
|
slf.isRunning = false
|
||||||
slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown)
|
slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if err := slf.httpServer.ListenAndServe(); err != nil {
|
if err := slf.httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
||||||
slf.isRunning = false
|
slf.isRunning = false
|
||||||
slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown)
|
slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown)
|
||||||
}
|
}
|
||||||
|
@ -432,6 +434,9 @@ func (slf *Server) HttpRouter() gin.IRouter {
|
||||||
|
|
||||||
// PushMessage 向服务器中写入特定类型的消息,需严格遵守消息属性要求
|
// PushMessage 向服务器中写入特定类型的消息,需严格遵守消息属性要求
|
||||||
func (slf *Server) PushMessage(messageType MessageType, attrs ...any) {
|
func (slf *Server) PushMessage(messageType MessageType, attrs ...any) {
|
||||||
|
if slf.messagePool.IsClose() {
|
||||||
|
return
|
||||||
|
}
|
||||||
msg := slf.messagePool.Get()
|
msg := slf.messagePool.Get()
|
||||||
msg.t = messageType
|
msg.t = messageType
|
||||||
msg.attrs = attrs
|
msg.attrs = attrs
|
||||||
|
|
|
@ -48,6 +48,10 @@ func (slf *Pool[T]) Get() T {
|
||||||
return slf.generator()
|
return slf.generator()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (slf *Pool[T]) IsClose() bool {
|
||||||
|
return slf.generator == nil
|
||||||
|
}
|
||||||
|
|
||||||
func (slf *Pool[T]) Release(data T) {
|
func (slf *Pool[T]) Release(data T) {
|
||||||
slf.releaser(data)
|
slf.releaser(data)
|
||||||
slf.put(data)
|
slf.put(data)
|
||||||
|
|
Loading…
Reference in New Issue