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 }