完成v1版本redis时间队列

This commit is contained in:
白茶清欢 2024-06-27 18:37:22 +08:00
parent 7fe6003db8
commit da01f284b6

View File

@ -14,6 +14,7 @@ import (
"git.zhangdeman.cn/zhangdeman/consts" "git.zhangdeman.cn/zhangdeman/consts"
"git.zhangdeman.cn/zhangdeman/event/abstract" "git.zhangdeman.cn/zhangdeman/event/abstract"
"git.zhangdeman.cn/zhangdeman/event/define" "git.zhangdeman.cn/zhangdeman/event/define"
"git.zhangdeman.cn/zhangdeman/serialize"
"git.zhangdeman.cn/zhangdeman/wrapper" "git.zhangdeman.cn/zhangdeman/wrapper"
"github.com/redis/go-redis/v9" "github.com/redis/go-redis/v9"
"time" "time"
@ -34,6 +35,7 @@ func InitRedisPubSubEvent(redisClient *redis.Client, pubSubConfig *define.RedisE
pubSubConfig: pubSubConfig, pubSubConfig: pubSubConfig,
} }
instance.SetRedisClient(redisClient, pubSubConfig) instance.SetRedisClient(redisClient, pubSubConfig)
instance.StartConsumer() // 启动消费者
RedisEventPubSubClient = instance RedisEventPubSubClient = instance
} }
@ -152,6 +154,25 @@ func (r *RedisEventPubSub) ConsumeEvent(handler abstract.EventHandler, successCa
if nil == successCallback { if nil == successCallback {
successCallback = define.DefaultSuccessCallbackHandler successCallback = define.DefaultSuccessCallbackHandler
} }
for eventData := range messageChan {
handlerResult, handleErr := handler(eventData)
if nil != handleErr {
failureCallback(eventData, handlerResult, err)
} else {
successCallback(eventData, handlerResult)
}
}
return nil
}
// StartConsumer 启动消费者
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:36 2024/6/27
func (r *RedisEventPubSub) StartConsumer() {
for partition := 0; partition < r.pubSubConfig.PartitionNum; partition++ { for partition := 0; partition < r.pubSubConfig.PartitionNum; partition++ {
go func(realPartition int) { go func(realPartition int) {
defer func() { defer func() {
@ -159,23 +180,23 @@ func (r *RedisEventPubSub) ConsumeEvent(handler abstract.EventHandler, successCa
r.panicCallback(panicErr, nil, nil) r.panicCallback(panicErr, nil, nil)
} }
}() }()
for !r.isStop || (r.isStop && len(messageChan) == 0) { // 启动消费者
select { realTopic := fmt.Sprintf("%v_%v", r.pubSubConfig.Topic, realPartition)
case eventData := <-messageChan: messageChannel := r.redisClient.Subscribe(context.Background(), realTopic).Channel()
handlerResult, handlerErr := handler(eventData) for message := range messageChannel {
if nil != handlerErr { var (
// 失败回调 eventData define.EventData
failureCallback(eventData, handlerResult, handlerErr) err error
} else { )
// 成功回调
successCallback(eventData, handlerResult) if err = serialize.JSON.UnmarshalWithNumber([]byte(message.Payload), &eventData); nil != err {
} // TODO : 事件数据解析失败的回调
continue
} }
r.messageChan <- &eventData
} }
}(partition) }(partition)
} }
return nil
} }
// Destroy 销毁事件实例 // Destroy 销毁事件实例