github.com/qxnw/lib4go@v0.0.0-20180426074627-c80c7e84b925/mq/mq.producer.go (about)

     1  package mq
     2  
     3  import (
     4  	"fmt"
     5  	"sync/atomic"
     6  	"time"
     7  )
     8  
     9  type ProcuderMessage struct {
    10  	Headers   []string
    11  	Queue     string
    12  	Data      string
    13  	SendTimes int32
    14  	Timeout   time.Duration
    15  }
    16  
    17  func (p *ProcuderMessage) AddSendTimes() {
    18  	atomic.AddInt32(&p.SendTimes, 1)
    19  }
    20  
    21  type MQProducer interface {
    22  	Connect() error
    23  	GetBackupMessage() chan *ProcuderMessage
    24  	Send(queue string, msg string, timeout time.Duration) (err error)
    25  	Close()
    26  }
    27  
    28  //MQConsumerResover 定义配置文件转换方法
    29  type MQProducerResover interface {
    30  	Resolve(address string, opts ...Option) (MQProducer, error)
    31  }
    32  
    33  var mqProducerResolvers = make(map[string]MQProducerResover)
    34  
    35  //RegisterProducer 注册配置文件适配器
    36  func RegisterProducer(proto string, resolver MQProducerResover) {
    37  	if resolver == nil {
    38  		panic("mq: Register adapter is nil")
    39  	}
    40  	if _, ok := mqProducerResolvers[proto]; ok {
    41  		panic("mq: Register called twice for adapter " + proto)
    42  	}
    43  	mqProducerResolvers[proto] = resolver
    44  }
    45  
    46  //NewMQProducer 根据适配器名称及参数返回配置处理器
    47  func NewMQProducer(address string, opts ...Option) (MQProducer, error) {
    48  	proto, addrs, err := getMQNames(address)
    49  	if err != nil {
    50  		return nil, err
    51  	}
    52  	resolver, ok := mqProducerResolvers[proto]
    53  	if !ok {
    54  		return nil, fmt.Errorf("mq: unknown adapter name %q (forgotten import?)", proto)
    55  	}
    56  	return resolver.Resolve(addrs[0], opts...)
    57  }