github.com/qxnw/lib4go@v0.0.0-20180426074627-c80c7e84b925/mq/redis/redis.producer.go (about) 1 package redis 2 3 import ( 4 "errors" 5 "time" 6 7 "github.com/qxnw/lib4go/logger" 8 "github.com/qxnw/lib4go/mq" 9 "github.com/qxnw/lib4go/redis" 10 ) 11 12 //RedisProducer Producer 13 type RedisProducer struct { 14 address string 15 client *redis.Client 16 backupMsg chan *mq.ProcuderMessage 17 closeCh chan struct{} 18 done bool 19 *mq.OptionConf 20 } 21 22 //NewRedisProducer 创建新的producer 23 func NewRedisProducer(address string, opts ...mq.Option) (producer *RedisProducer, err error) { 24 producer = &RedisProducer{address: address} 25 producer.OptionConf = &mq.OptionConf{Logger: logger.GetSession("mq.redis", logger.CreateSession())} 26 producer.closeCh = make(chan struct{}) 27 for _, opt := range opts { 28 opt(producer.OptionConf) 29 } 30 return 31 } 32 33 //Connect 循环连接服务器 34 func (producer *RedisProducer) Connect() (err error) { 35 producer.client, err = redis.NewClientByJSON(producer.Raw) 36 return 37 } 38 39 //GetBackupMessage 获取备份数据 40 func (producer *RedisProducer) GetBackupMessage() chan *mq.ProcuderMessage { 41 return producer.backupMsg 42 } 43 44 //Send 发送消息 45 func (producer *RedisProducer) Send(queue string, msg string, timeout time.Duration) (err error) { 46 if producer.done { 47 return errors.New("mq producer 已关闭") 48 } 49 _, err = producer.client.RPush(queue, msg).Result() 50 return 51 } 52 53 //Close 关闭当前连接 54 func (producer *RedisProducer) Close() { 55 producer.done = true 56 close(producer.closeCh) 57 close(producer.backupMsg) 58 producer.client.Close() 59 } 60 61 type redisProducerResolver struct { 62 } 63 64 func (s *redisProducerResolver) Resolve(address string, opts ...mq.Option) (mq.MQProducer, error) { 65 return NewRedisProducer(address, opts...) 66 } 67 func init() { 68 mq.RegisterProducer("redis", &redisProducerResolver{}) 69 }