github.com/johnnyeven/libtools@v0.0.0-20191126065708-61829c1adf46/task/gearman/consumer.go (about) 1 package gearman 2 3 import ( 4 "fmt" 5 "github.com/johnnyeven/libtools/task/constants" 6 "github.com/mikespook/gearman-go/worker" 7 "github.com/sirupsen/logrus" 8 ) 9 10 type GearmanConsumer struct { 11 worker *worker.Worker 12 workerProcessor constants.TaskProcessor 13 } 14 15 func NewGearmanConsumer(info constants.ConnectionInfo) *GearmanConsumer { 16 w := worker.New(worker.Unlimited) 17 w.AddServer(info.Protocol, fmt.Sprintf("%s:%d", info.Host, info.Port)) 18 w.ErrorHandler = func(e error) { 19 logrus.Errorf("worker handled err: %v", e) 20 } 21 return &GearmanConsumer{ 22 worker: w, 23 } 24 } 25 26 func (b *GearmanConsumer) RegisterChannel(channel string, processor constants.TaskProcessor) error { 27 b.workerProcessor = processor 28 return b.worker.AddFunc(channel, b.processorJob, worker.Unlimited) 29 } 30 31 func (b *GearmanConsumer) processorJob(job worker.Job) ([]byte, error) { 32 t := &constants.Task{} 33 err := constants.UnmarshalData(job.Data(), t) 34 if err != nil { 35 return nil, err 36 } 37 ret, err := b.workerProcessor(t) 38 if err != nil { 39 return nil, err 40 } 41 return constants.MarshalData(ret) 42 } 43 44 func (b *GearmanConsumer) Work() { 45 if err := b.worker.Ready(); err != nil { 46 logrus.Panic("gearman worker not ready...") 47 } 48 logrus.Debug("GearmanConsumer.Working...") 49 b.worker.Work() 50 } 51 52 func (b *GearmanConsumer) Stop() { 53 b.worker.Close() 54 logrus.Debug("GearmanConsumer.Stopped") 55 }