golang轻量级可插拔事件循环与定时器依赖注入插件库anagent的使用

Golang轻量级可插拔事件循环与定时器依赖注入插件库anagent的使用

Anagent是一个轻量级的Golang库,它提供了可插拔的事件循环和定时器处理功能,并支持依赖注入。它基于codegangsta/inject、go-macaron/inject和chuckpreslar/emission库构建。

事件发射器与依赖注入

下面是一个使用依赖注入的示例:

package main

import (
	"log"
	"github.com/mudler/anagent"
)

type TestTest struct {
	Test string
}

func main() {
	agent := anagent.New()
	mytest := &TestTest{Test: "PONG!"}
	agent.Map(mytest) // 将mytest实例映射到agent中

	// 注册一次性事件处理器,可以访问注入的依赖
	agent.Once("test", func(te *TestTest, l *log.Logger) {
		if te.Test == "PONG!" {
			l.Println("It just works!")
		}
	})

	agent.Emit("test") // 触发事件
}

在这个例子中,我们通过agent.Map()TestTest结构体实例映射到agent中,所有触发的事件处理器都可以访问这些依赖。

定时器/反应器

下面是一个使用定时器的示例:

package main

import "github.com/mudler/anagent"
import "fmt"

type TestTest struct {
	Test string
}

func main() {
	agent := anagent.New()
	mytest := &TestTest{Test: "PONG!"}
	agent.Map(mytest)

	// 注册事件处理器
	agent.Emitter().On("test", func(s string) { fmt.Println("Received: " + s) })

	// 设置一个3秒的非循环定时器
	agent.TimerSeconds(int64(3), false, func(a *anagent.Anagent, te *TestTest) {
		a.Emitter().Emit("test", te.Test) // 触发事件
		go a.Stop() // 停止事件循环
	})

	agent.Start() // 启动事件循环,将在此处阻塞
}

这段代码会启动并等待3秒,然后执行回调函数(非循环,因此第二个参数为false),触发之前定义的自定义事件。注意这里直接通过agent.Emitter()访问发射器,而不是使用依赖注入功能。

集成到其他事件循环

我们可以将anagent集成到其他框架的事件循环中:

package main

import "github.com/mudler/anagent"
import "fmt"

type TestTest struct {
	Test string
}

func main() {
	agent := anagent.New()
	mytest := &TestTest{Test: "PONG!"}
	agent.Map(mytest)

	// 注册事件处理器,延迟2秒响应
	agent.Emitter().On("test", func(s string) {
		agent.TimerSeconds(int64(2), false, func() {
			fmt.Println("Received: " + s)
		})
	})

	// 设置一个3秒的循环定时器
	agent.TimerSeconds(int64(3), true, func(a *anagent.Anagent, te *TestTest) {
		fmt.Println("PING!")
		a.Emitter().Emit("test", te.Test)
	})

	for { // 无限循环
		agent.Step() // 手动执行一步事件处理
	}
}

在这个例子中,我们创建了一个3秒的循环定时器,每次触发时会打印"PING!"并发射"test"事件。事件处理器会延迟2秒后打印接收到的消息。通过调用agent.Step(),我们可以将anagent集成到自己的事件循环中。


更多关于golang轻量级可插拔事件循环与定时器依赖注入插件库anagent的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang轻量级可插拔事件循环与定时器依赖注入插件库anagent的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang轻量级事件循环与定时器插件库anagent使用指南

anagent是一个轻量级的Golang库,提供了事件循环和定时器功能,支持依赖注入和插件机制。下面我将详细介绍它的使用方法。

安装

go get github.com/mudler/anagent

基本用法

1. 创建Agent实例

package main

import (
	"github.com/mudler/anagent"
	"log"
	"time"
)

func main() {
	agent := anagent.New()
	
	// 这里添加事件处理器或定时器
	
	// 启动事件循环
	agent.Start()
}

2. 添加定时任务

// 每5秒执行一次
agent.TimerSeconds(5, func(a *anagent.Anagent) {
    log.Println("定时任务执行 - 每5秒")
})

// 每1分钟执行一次
agent.TimerMinutes(1, func(a *anagent.Anagent) {
    log.Println("定时任务执行 - 每1分钟")
})

// 一次性延迟任务(3秒后执行)
agent.Timeout(time.Second*3, func(a *anagent.Anagent) {
    log.Println("延迟任务执行 - 3秒后")
})

3. 自定义定时器

// 自定义间隔的定时器
ticker := time.NewTicker(2 * time.Second)
agent.AddTimer(ticker, func(a *anagent.Anagent) bool {
    log.Println("自定义定时器执行 - 每2秒")
    return true // 返回true表示继续执行,false表示停止
})

4. 事件处理

// 注册事件处理器
agent.On("event.name", func(a *anagent.Anagent) {
    log.Println("收到事件: event.name")
})

// 触发事件
agent.Emit("event.name")

5. 依赖注入

type MyService struct {
    Name string
}

func main() {
    agent := anagent.New()
    
    // 注入依赖
    agent.Map(&MyService{Name: "TestService"})
    
    agent.TimerSeconds(1, func(a *anagent.Anagent) {
        // 获取依赖
        var service *MyService
        a.Get(&service)
        log.Println("服务名称:", service.Name)
    })
    
    agent.Start()
}

插件开发示例

anagent支持插件机制,可以方便地扩展功能:

type MyPlugin struct{}

func (p *MyPlugin) Name() string {
    return "MyPlugin"
}

func (p *MyPlugin) OnLoad(agent *anagent.Anagent) error {
    log.Println("插件加载:", p.Name())
    
    agent.TimerSeconds(10, func(a *anagent.Anagent) {
        log.Println("插件定时任务执行")
    })
    
    return nil
}

func main() {
    agent := anagent.New()
    agent.Plugin(&MyPlugin{})
    agent.Start()
}

高级特性

1. 中间件

agent.Use(func(next anagent.Handler) anagent.Handler {
    return func(a *anagent.Anagent) {
        start := time.Now()
        next(a)
        log.Printf("处理耗时: %v", time.Since(start))
    }
})

2. 优雅关闭

go func() {
    time.Sleep(10 * time.Second)
    agent.Stop() // 停止事件循环
}()

agent.Start()

3. 共享数据

// 设置共享数据
agent.Set("key", "value")

// 获取共享数据
if val, ok := agent.Get("key").(string); ok {
    log.Println("共享数据:", val)
}

实际应用示例

package main

import (
	"github.com/mudler/anagent"
	"log"
	"time"
)

type AppConfig struct {
	Interval time.Duration
	Message  string
}

func main() {
	agent := anagent.New()
	
	// 注入配置
	config := &AppConfig{
		Interval: time.Second * 2,
		Message:  "Hello from anagent!",
	}
	agent.Map(config)
	
	// 定时任务
	agent.Timer(config.Interval, func(a *anagent.Anagent) {
		var cfg *AppConfig
		a.Get(&cfg)
		log.Println(cfg.Message)
	})
	
	// 模拟外部事件
	go func() {
		time.Sleep(5 * time.Second)
		agent.Emit("shutdown")
	}()
	
	// 事件处理
	agent.On("shutdown", func(a *anagent.Anagent) {
		log.Println("收到关闭事件,准备退出...")
		a.Stop()
	})
	
	// 启动
	log.Println("应用启动")
	agent.Start()
	log.Println("应用退出")
}

总结

anagent提供了以下核心功能:

  1. 轻量级事件循环
  2. 灵活的定时器支持
  3. 依赖注入容器
  4. 插件机制
  5. 中间件支持

它非常适合需要事件驱动、定时任务或插件化架构的Golang应用程序,相比其他框架更加轻量且易于集成。

回到顶部