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("消息应答失败!")
}
}
}
}
}