github.com/johnnyeven/libtools@v0.0.0-20191126065708-61829c1adf46/mq/redis/redis_broker.go (about)

     1  package redis
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  
     7  	"github.com/gomodule/redigo/redis"
     8  
     9  	"github.com/johnnyeven/libtools/mq"
    10  )
    11  
    12  func NewRedisBroker(pool *redis.Pool, prefix string) *RedisBroker {
    13  	return &RedisBroker{
    14  		prefix: prefix,
    15  		pool:   pool,
    16  	}
    17  }
    18  
    19  type RedisBroker struct {
    20  	prefix string
    21  	pool   *redis.Pool
    22  }
    23  
    24  var _ mq.Broker = (*RedisBroker)(nil)
    25  
    26  func (broker *RedisBroker) SendTask(task *mq.Task) error {
    27  	data, err := json.Marshal(task)
    28  	if err != nil {
    29  		return err
    30  	}
    31  	_, err = ConnRedis(broker.pool).Do("RPUSH", mq.Prefix(task.Channel, broker.prefix), data)
    32  	return err
    33  }
    34  
    35  func (broker *RedisBroker) GetTask(channel string) (*mq.Task, error) {
    36  	channel = mq.Prefix(channel, broker.prefix)
    37  
    38  	ret, err := ConnRedis(broker.pool).Do("BLPOP", channel, "1")
    39  	if err != nil {
    40  		return nil, err
    41  	}
    42  
    43  	if ret == nil {
    44  		return nil, fmt.Errorf("null message received from redis")
    45  	}
    46  
    47  	msgPair := ret.([]interface{})
    48  
    49  	if string(msgPair[0].([]byte)) != channel {
    50  		return nil, fmt.Errorf("not a broker message: %v", msgPair[0])
    51  	}
    52  
    53  	task := (*mq.Task)(nil)
    54  	if err := json.Unmarshal(msgPair[1].([]byte), &task); err != nil {
    55  		return nil, err
    56  	}
    57  	return task, nil
    58  }