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  }