2 Star 1 Fork 0

法马智慧/fmgo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
engine.go 2.50 KB
一键复制 编辑 原始数据 按行查看 历史
package emqx
import (
mqtt "github.com/eclipse/paho.mqtt.golang"
"strings"
)
type HookHandler func(*Context)
type HandlerFunc func(*Context)
type Engine struct {
*Options
Topic string
TopicLen int
Wildcard bool
Shared bool
ShareGroup string
node *node
BeforeHook []HookHandler
AfterHook []HookHandler
}
func (o *Options) NewEngine(topic string, wildcard bool) (eng *Engine) {
eng = &Engine{
Options: o,
Topic: topic,
Wildcard: wildcard,
node: &node{
Options: o,
},
}
eng.checkTopic()
o.Engine = append(o.Engine, eng)
return
}
func (e *Engine) checkTopic() {
if e.Topic[0] == '/' {
e.Logger.Fatal("topic禁止以'/'符号开头")
}
if e.Topic[len(e.Topic)-1] == '/' {
e.Logger.Fatal("topic禁止以'/'符号开头")
}
e.TopicLen = len(strings.Split(e.Topic, "/"))
}
func (e *Engine) UseBefore(handler ...HookHandler) {
e.BeforeHook = handler
}
func (e *Engine) UseAfter(handler ...HookHandler) {
e.AfterHook = handler
}
// Register 注册方法到前缀树
func (e *Engine) Register(url string, handler HandlerFunc) {
if handler == nil {
e.Logger.Fatal("此topic未绑定方法")
}
e.checkUrl(url)
path := e.splitUrl(url)
for i, s := range path {
if s == "" {
path = append(path[:i], path[i+1:]...)
}
}
e.node = e.node.addRoute(path, handler)
}
// WithShare 注册共享订阅
func (e *Engine) WithShare(group string) {
e.Shared = true
if group == "" {
e.ShareGroup = "default"
}
e.ShareGroup = group
}
// distribute 接收到topic后进行分发
func (e *Engine) distribute(client mqtt.Client, msg mqtt.Message) {
go e.handle(client, msg)
}
// handle 分发到具体的逻辑方法
func (e *Engine) handle(client mqtt.Client, msg mqtt.Message) {
path := strings.Split(msg.Topic(), "/")[e.TopicLen:]
logic := e.node.FindRoute(path)
if logic == nil {
e.Logger.Error("未找到对应的方法", msg.Topic())
return
}
context := NewContext(client, msg, path)
for _, hookHandler := range e.BeforeHook {
hookHandler(context)
}
logic.Handler(context)
for _, hookHandler := range e.AfterHook {
hookHandler(context)
}
}
func (e *Engine) splitUrl(url string) []string {
urlList := strings.Split(url, "/")
for i, s := range urlList {
if s == "" {
urlList = append(urlList[:i], urlList[i+1:]...)
}
}
return urlList
}
func (e *Engine) checkUrl(url string) {
if url == "" {
return
}
if url[0] != '/' {
e.Logger.Fatal("路由必须以'/'符号开头")
}
if url[len(url)-1] == '/' {
e.Logger.Fatal("路由禁止以'/'符号开头")
}
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/fmpt/fmgo.git
git@gitee.com:fmpt/fmgo.git
fmpt
fmgo
fmgo
v1.3.8

搜索帮助