完善接口抽象 + redis实现

This commit is contained in:
2024-06-26 18:15:34 +08:00
parent 87b2742e36
commit 6f56ff3c4f
3 changed files with 159 additions and 47 deletions

View File

@ -9,6 +9,8 @@ package event
import (
"context"
"errors"
"fmt"
"git.zhangdeman.cn/zhangdeman/consts"
"git.zhangdeman.cn/zhangdeman/event/abstract"
"git.zhangdeman.cn/zhangdeman/event/define"
@ -40,45 +42,94 @@ func InitRedisPubSubEvent(redisClient *redis.Client, pubSubConfig *define.RedisE
//
// Date : 16:07 2024/6/25
type RedisEventPubSub struct {
redisClient *redis.Client // redis客户端
pubSubConfig *define.RedisEventPubSubConfig // 事件配置
messageChan chan *define.EventData // 消息队列
stopConsumer chan bool // 停止消费者
redisClient *redis.Client // redis客户端
pubSubConfig *define.RedisEventPubSubConfig // 事件配置
messageChan chan *define.EventData // 消息队列
stopConsumer chan bool // 停止消费者
isStop bool // 是否已停止
panicCallback abstract.PanicCallback // panic回调
}
func (r *RedisEventPubSub) SendEvent(ctx context.Context, eventData *define.EventData) (*define.SendResult, error) {
func (r *RedisEventPubSub) SendEvent(ctx context.Context, eventData *define.EventData, sendSuccessCallback abstract.SendSuccessCallback, sendFailCallback abstract.SendFailCallback) (*define.SendResult, error) {
//TODO implement me
panic("implement me")
}
func (r *RedisEventPubSub) SendEventAsync(ctx context.Context, eventData *define.EventData) {
func (r *RedisEventPubSub) SendEventAsync(ctx context.Context, eventData *define.EventData, sendSuccessCallback abstract.SendSuccessCallback, sendFailCallback abstract.SendFailCallback) {
//TODO implement me
panic("implement me")
}
func (r *RedisEventPubSub) SendFailCallback(ctx context.Context, eventResult *define.SendResult) {
//TODO implement me
panic("implement me")
// GetConsumeEventChan 获取消息channel, 自行实现消费
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:13 2024/6/26
func (r *RedisEventPubSub) GetConsumeEventChan() (<-chan *define.EventData, error) {
if r.isStop {
return nil, errors.New("event instance has stop")
}
return r.messageChan, nil
}
func (r *RedisEventPubSub) SendSuccessCallback(ctx context.Context, eventResult *define.SendResult, err error) {
//TODO implement me
panic("implement me")
// SetPanicCallback 出现任何panic的回调
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:02 2024/6/26
func (r *RedisEventPubSub) SetPanicCallback(panicCallback abstract.PanicCallback) {
if nil == panicCallback {
panicCallback = define.DefaultPanicCallback
}
r.panicCallback = panicCallback
}
func (r *RedisEventPubSub) ConsumeEvent() (<-chan *define.EventData, error) {
//TODO implement me
panic("implement me")
}
// ConsumeEvent 获取数据消费实例
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:06 2024/6/26
func (r *RedisEventPubSub) ConsumeEvent(handler abstract.EventHandler, successCallback abstract.ConsumeSuccessCallback, failureCallback abstract.ConsumeFailCallbackHandler) error {
if nil == handler {
return errors.New("handler is nil")
}
var (
messageChan <-chan *define.EventData
err error
)
func (r *RedisEventPubSub) ConsumeFailCallback(eventData *define.EventData, err error) {
//TODO implement me
panic("implement me")
}
if messageChan, err = r.GetConsumeEventChan(); nil != err {
return err
}
if nil == failureCallback {
failureCallback = define.DefaultFailCallbackHandler
}
if nil == successCallback {
successCallback = define.DefaultSuccessCallbackHandler
}
go func() {
defer func() {
if panicErr := recover(); nil != panicErr {
fmt.Println(r)
}
}()
for !r.isStop || (r.isStop && len(messageChan) == 0) {
select {
case eventData := <-messageChan:
handlerResult, handlerErr := handler(eventData)
if nil != handlerErr {
// 失败回调
failureCallback(eventData, handlerResult, handlerErr)
break
} else {
// 成功回调
successCallback(eventData, handlerResult)
}
}
}
}()
func (r *RedisEventPubSub) ConsumeSuccessCallback(eventData *define.EventData) {
//TODO implement me
panic("implement me")
return nil
}
// Destroy 销毁事件实例
@ -87,6 +138,10 @@ func (r *RedisEventPubSub) ConsumeSuccessCallback(eventData *define.EventData) {
//
// Date : 15:42 2024/6/26
func (r *RedisEventPubSub) Destroy() {
if r.isStop {
// 已停止
return
}
r.stopConsumer <- true // 停止消费者
messageChan := make(chan bool, 1)
go func() {