go go-stomp在activeMQ的初步应用

go go-stomp在activeMQ的初步应用

activeMQ部署不在这里介绍,随便一搜一大把。

最近在做一个系统,其中需要用到消息队列。选来选去就选择了activeMQ,最开始在网上搜了一下go在activeMQ的用法,根据网上的代码实现之后。发现了几个问题:

1:当没有消息入队或者出队的时候,5分钟之后,生产者和消费者都会断开连接,5分钟之后,再发送消息到消息队列,会出现连接超时(connect timeout),读取消息也会出现读取超时(read timeout)。

2:消费者读取消息处理完之后,队列中的消息条数并没有减少。

为了解决这个两个问题,看了下官方文档:https://github.com/go-stomp/stomp

1:解决超时问题,在链接activeMQ的时候,需要设置读写链接超时限制;如果没有这个设置这两项,默认超时时间是5分钟。

2:当消费者获取到消息之后,需要发送一个应答给消息队列;不然消息还是会存在消息队列中。

针对上面的情况,我将代码贴出来,不说多了废话。

//解决第一个问题的代码
var activeConn *stomp.Conn
var options = []func(*stomp.Conn) error{
	//设置读写超时,超时时间为1个小时
	stomp.ConnOpt.HeartBeat(7200*time.Second, 7200*time.Second),
	stomp.ConnOpt.HeartBeatError(360 * time.Second),
}

func init() {
	address := common.GetMQAddress()
	conn, err := stomp.Dial("tcp", address, options...)
	if err != nil {
		logs.Error("链接active mq 失败:", err.Error())
		os.Exit(1)
	}
	activeConn = conn
}

func GetActiveMQConn() *stomp.Conn {
	return activeConn
}
//解决第二个问题
func CreateSupplierOrderQueryCuConsumer() {

	conn := message_queue.GetActiveMQConn()
	if conn == nil {
		logs.Error("supplier order query consumer fail")
		os.Exit(1)
	}
	logs.Notice("启动订单查询的消费者成功.....")
	orderQuerySub, _ := conn.Subscribe(common.MqOrderQuery, stomp.AckClient)

	for {
		select {
		case v := <-orderQuerySub.C:
			if v != nil {
				bankOrderId := string(v.Body)
				logs.Info("消费者正在处理订单查询: " + bankOrderId)
				solveSupplierOrderQuery(bankOrderId)
				//应答,重要
				err := conn.Ack(v)
				if err != nil {
					logs.Error("消息应答失败!")
				}
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值