feat: modular 包新增 Block 接口,当模块化服务实现 modular.Service 后可选择的实现 Block 接口,该接口将适用于具有阻塞等待需求的服务,例如网络服务器。
This commit is contained in:
parent
a2695f4fcf
commit
3549fcca11
|
@ -0,0 +1,10 @@
|
||||||
|
package modular
|
||||||
|
|
||||||
|
// Block 标识模块化服务为阻塞进程的服务,当实现了 Service 且实现了 Block 接口时,模块化应用程序会在 Service.OnMount 阶段完成后执行 OnBlock 函数
|
||||||
|
//
|
||||||
|
// 该接口适用于 Http 服务、WebSocket 服务等需要阻塞进程的服务。需要注意的是, OnBlock 的执行不能保证按照 Service 的注册顺序执行
|
||||||
|
type Block interface {
|
||||||
|
Service
|
||||||
|
// OnBlock 阻塞进程
|
||||||
|
OnBlock()
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/kercylan98/minotaur/server"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Service struct {
|
||||||
|
srv *server.Server
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) OnInit() {
|
||||||
|
s.srv = server.New(server.NetworkNone, server.WithLimitLife(time.Second*3))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) OnPreload() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) OnMount() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) OnBlock() {
|
||||||
|
if err := s.srv.RunNone(); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,11 +4,13 @@ import (
|
||||||
"github.com/kercylan98/minotaur/modular"
|
"github.com/kercylan98/minotaur/modular"
|
||||||
"github.com/kercylan98/minotaur/modular/example/internal/service/services/attack"
|
"github.com/kercylan98/minotaur/modular/example/internal/service/services/attack"
|
||||||
"github.com/kercylan98/minotaur/modular/example/internal/service/services/login"
|
"github.com/kercylan98/minotaur/modular/example/internal/service/services/login"
|
||||||
|
"github.com/kercylan98/minotaur/modular/example/internal/service/services/server"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
modular.RegisterServices(
|
modular.RegisterServices(
|
||||||
new(attack.Service),
|
new(attack.Service),
|
||||||
|
new(server.Service),
|
||||||
new(login.Service),
|
new(login.Service),
|
||||||
)
|
)
|
||||||
modular.Run()
|
modular.Run()
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/kercylan98/minotaur/utils/log"
|
"github.com/kercylan98/minotaur/utils/log"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
var application *modular
|
var application *modular
|
||||||
|
@ -56,4 +57,19 @@ func Run() {
|
||||||
s := m.services[i]
|
s := m.services[i]
|
||||||
s.instance.OnMount()
|
s.instance.OnMount()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OnBlock
|
||||||
|
var wait = new(sync.WaitGroup)
|
||||||
|
for i := 0; i < len(m.services); i++ {
|
||||||
|
s := m.services[i]
|
||||||
|
if block, ok := s.instance.(Block); ok {
|
||||||
|
wait.Add(1)
|
||||||
|
go func(wait *sync.WaitGroup) {
|
||||||
|
defer wait.Done()
|
||||||
|
block.OnBlock()
|
||||||
|
}(wait)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wait.Wait()
|
||||||
|
log.Info("all services exited")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue