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

     1  package mq
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  )
     7  
     8  type MQConsumer interface {
     9  	Connect() error
    10  	Consume(queue string, concurrency int, callback func(IMessage)) (err error)
    11  	UnConsume(queue string)
    12  	Close()
    13  }
    14  
    15  //MQConsumerResover 定义配置文件转换方法
    16  type MQConsumerResover interface {
    17  	Resolve(address string, opts ...Option) (MQConsumer, error)
    18  }
    19  
    20  var mqConsumerResolvers = make(map[string]MQConsumerResover)
    21  
    22  //RegisterCosnumer 注册配置文件适配器
    23  func RegisterCosnumer(adapter string, resolver MQConsumerResover) {
    24  	if resolver == nil {
    25  		panic("mq: Register adapter is nil")
    26  	}
    27  	if _, ok := mqConsumerResolvers[adapter]; ok {
    28  		panic("mq: Register called twice for adapter " + adapter)
    29  	}
    30  	mqConsumerResolvers[adapter] = resolver
    31  }
    32  
    33  //NewMQConsumer 根据适配器名称及参数返回配置处理器
    34  func NewMQConsumer(address string, opts ...Option) (MQConsumer, error) {
    35  	proto, addrs, err := getMQNames(address)
    36  	if err != nil {
    37  		return nil, err
    38  	}
    39  	resolver, ok := mqConsumerResolvers[proto]
    40  	if !ok {
    41  		return nil, fmt.Errorf("mq: unknown adapter name %q (forgotten import?)", proto)
    42  	}
    43  	return resolver.Resolve(addrs[0], opts...)
    44  }
    45  func getMQNames(address string) (proto string, raddr []string, err error) {
    46  	addr := strings.Split(address, "://")
    47  	if len(addr) > 2 {
    48  		return "", nil, fmt.Errorf("MQ地址配置错误%s,格式:stomp://192.168.0.1:61613", addr)
    49  	}
    50  	if len(addr[0]) == 0 {
    51  		return "", nil, fmt.Errorf("MQ地址配置错误%s,格式:stomp://192.168.0.1:61613", addr)
    52  	}
    53  	proto = addr[0]
    54  	if len(addr) > 1 {
    55  		raddr = strings.Split(addr[1], ",")
    56  	} else {
    57  		raddr = append(raddr, "")
    58  	}
    59  	return
    60  }