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  }