You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nnet/options.go

115 lines
2.8 KiB
Go

package nnet
import (
"git.noahlan.cn/noahlan/nnet/connection"
"git.noahlan.cn/noahlan/nnet/lifetime"
"git.noahlan.cn/noahlan/nnet/packet"
rt "git.noahlan.cn/noahlan/nnet/router"
"git.noahlan.cn/noahlan/ntool/ndef"
"git.noahlan.cn/noahlan/ntool/npool"
"github.com/panjf2000/ants/v2"
"time"
)
type (
// RunOption defines the method to customize an Engine.
RunOption func(ngin *Engine)
)
// Pipeline returns inner pipeline
func (ngin *Engine) Pipeline() connection.Pipeline {
return ngin.pipeline
}
// Lifetime returns lifetime interface.
func (ngin *Engine) Lifetime() lifetime.Lifetime {
return ngin.lifetime
}
// ConnManager returns connection manager
func (ngin *Engine) ConnManager() *connection.Manager {
return ngin.connManager
}
//////////////////////// Options
func WithMiddleware(middleware ...rt.Middleware) RunOption {
return func(ngin *Engine) {
ngin.Use(middleware...)
}
}
// WithRouter 设置消息路由
func WithRouter(router rt.Router) RunOption {
return func(ngin *Engine) {
ngin.router = router
}
}
// WithNotFoundHandler returns a RunOption with not found handler set to given handler.
func WithNotFoundHandler(handler rt.Handler) RunOption {
return func(ngin *Engine) {
ngin.router.SetNotFoundHandler(rt.NotFoundHandler(handler))
}
}
// WithTimerPrecision 设置Timer精度需在 Start 或 Dial 之前执行
// 注精度需大于1ms, 并且不能在运行时更改
// 默认精度是 time.Second
func WithTimerPrecision(precision time.Duration) RunOption {
if precision < time.Millisecond {
panic("time precision can not less than a Millisecond")
}
return func(ngin *Engine) {
ngin.TaskTimerPrecision = precision
}
}
// WithPackerBuilder 设置 消息的封包/解包构造器
func WithPackerBuilder(fn packet.PackerBuilder) RunOption {
return func(ngin *Engine) {
ngin.packerBuilder = fn
}
}
// WithSerializer 设置消息的 序列化/反序列化 方式
func WithSerializer(s ndef.Serializer) RunOption {
return func(ngin *Engine) {
ngin.serializer = s
}
}
// WithPool 设置使用自定义的工作池
func WithPool(pl *ants.Pool) RunOption {
return func(ngin *Engine) {
ngin.goPool = pl
}
}
// WithPoolCfg 设置工作池配置
func WithPoolCfg(cfg npool.Config) RunOption {
return func(ngin *Engine) {
ngin.goPool, _ = ants.NewPool(cfg.PoolSize, ants.WithOptions(cfg.Options()))
}
}
//////////////////// Pipeline
// WithPipeline 使用自定义 pipeline
func WithPipeline(pipeline connection.Pipeline) RunOption {
return func(ngin *Engine) {
ngin.pipeline = pipeline
}
}
type PipelineOption func(opts connection.Pipeline)
// WithPipelineOpt 使用默认Pipeline并设置其配置
func WithPipelineOpt(opts ...func(connection.Pipeline)) RunOption {
return func(ngin *Engine) {
for _, opt := range opts {
opt(ngin.pipeline)
}
}
}