feat: enhance event handling and add scheduling capabilities
- Introduced a new scheduler to manage timed tasks within the event dispatcher. - Updated the dispatcher to support the new scheduler, allowing for improved event processing. - Enhanced action serialization in the OneBot11 adapter to convert message chains to the appropriate format. - Added new dependencies for cron scheduling and other indirect packages in go.mod and go.sum. - Improved logging for event publishing and handler matching, providing better insights during execution. - Refactored plugin loading to include scheduled job management.
This commit is contained in:
@@ -30,6 +30,7 @@ type Dispatcher struct {
|
||||
middlewares []protocol.Middleware
|
||||
logger *zap.Logger
|
||||
eventBus *EventBus
|
||||
scheduler *Scheduler
|
||||
metrics DispatcherMetrics
|
||||
mu sync.RWMutex
|
||||
workerPool chan struct{} // 工作池,限制并发数
|
||||
@@ -43,6 +44,13 @@ func NewDispatcher(eventBus *EventBus, logger *zap.Logger) *Dispatcher {
|
||||
return NewDispatcherWithConfig(eventBus, logger, 100, true)
|
||||
}
|
||||
|
||||
// NewDispatcherWithScheduler 创建带调度器的事件分发器
|
||||
func NewDispatcherWithScheduler(eventBus *EventBus, logger *zap.Logger, scheduler *Scheduler) *Dispatcher {
|
||||
dispatcher := NewDispatcherWithConfig(eventBus, logger, 100, true)
|
||||
dispatcher.scheduler = scheduler
|
||||
return dispatcher
|
||||
}
|
||||
|
||||
// NewDispatcherWithConfig 使用配置创建事件分发器
|
||||
func NewDispatcherWithConfig(eventBus *EventBus, logger *zap.Logger, maxWorkers int, async bool) *Dispatcher {
|
||||
if maxWorkers <= 0 {
|
||||
@@ -114,14 +122,37 @@ func (d *Dispatcher) Start(ctx context.Context) {
|
||||
go d.eventLoop(ctx, eventChan)
|
||||
}
|
||||
|
||||
// 启动调度器
|
||||
if d.scheduler != nil {
|
||||
if err := d.scheduler.Start(); err != nil {
|
||||
d.logger.Error("Failed to start scheduler", zap.Error(err))
|
||||
} else {
|
||||
d.logger.Info("Scheduler started")
|
||||
}
|
||||
}
|
||||
|
||||
d.logger.Info("Dispatcher started")
|
||||
}
|
||||
|
||||
// Stop 停止分发器
|
||||
func (d *Dispatcher) Stop() {
|
||||
// 停止调度器
|
||||
if d.scheduler != nil {
|
||||
if err := d.scheduler.Stop(); err != nil {
|
||||
d.logger.Error("Failed to stop scheduler", zap.Error(err))
|
||||
} else {
|
||||
d.logger.Info("Scheduler stopped")
|
||||
}
|
||||
}
|
||||
|
||||
d.logger.Info("Dispatcher stopped")
|
||||
}
|
||||
|
||||
// GetScheduler 获取调度器
|
||||
func (d *Dispatcher) GetScheduler() *Scheduler {
|
||||
return d.scheduler
|
||||
}
|
||||
|
||||
// eventLoop 事件循环
|
||||
func (d *Dispatcher) eventLoop(ctx context.Context, eventChan chan protocol.Event) {
|
||||
for {
|
||||
@@ -215,13 +246,16 @@ func (d *Dispatcher) createHandlerChain(ctx context.Context, event protocol.Even
|
||||
|
||||
for i, handler := range handlers {
|
||||
matched := handler.Match(event)
|
||||
d.logger.Info("Checking handler",
|
||||
d.logger.Debug("Checking handler",
|
||||
zap.Int("handler_index", i),
|
||||
zap.String("handler_name", handler.Name()),
|
||||
zap.Int("priority", handler.Priority()),
|
||||
zap.Bool("matched", matched))
|
||||
if matched {
|
||||
d.logger.Info("Handler matched, calling Handle",
|
||||
zap.Int("handler_index", i))
|
||||
zap.Int("handler_index", i),
|
||||
zap.String("handler_name", handler.Name()),
|
||||
zap.String("handler_description", handler.Description()))
|
||||
// 使用defer捕获单个handler的panic
|
||||
func() {
|
||||
defer func() {
|
||||
|
||||
Reference in New Issue
Block a user