fix: 修复 server.Multiple 关闭服务器空指针异常
This commit is contained in:
parent
5f8cc1341e
commit
1136af4dd8
|
@ -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:]
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue