Golang之ActiveMQ基础使用

505 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

ActiveMQ是使用Java语言开发的消息队列,与目前市面上比较流行的消息队列(Kafka、RocketMQ)相比具有较早的发行时间,最早的代码提交时间为2006年,最早的版本为2007年发行的4.0-M4。虽然在当下的消息队列中占有的市场份额较少,但也曾辉煌一时,本文将从以下几点出发阐述如何安装并使用ActiveMQ:

  • 基于Docker安装ActiveMQ

  • 基于Web端操作ActiveMQ中的数据

  • Golang客户端安装

  • 基于Golang客户端操作ActiveMQ中的数据

官方文档:activemq.apache.org/version-5-g…

Golang模块参考文档:pkg.go.dev/github.com/…

基于Docker安装ActiveMQ

ActiveMQ的默认Web服务端口为8161、后台服务端口为61613,所以需要把端口8161、61613向外暴露服务

docker run -d --name some-activemq -p 61613:61613 -p 8161:8161 rmohr/activemq

如果能够正常访问127.0.0.1:8161,说明服务启动成功了,默认登入的账号密码为admin/admin

Web端使用

  • 创建队列

输入队列名称后,点击Create就能够创建队列

image.png

  • 创建主题

输入主题名称后,点击Create创建主题

image.png

  • 发送消息

参考以下页面可往指定的Topic中发送消息

image.png

golang 模块安装

ActiveMQ官方没有提供Golang的客户端,一般使用stomp来操作ActiveMQ中的数据

go get github.com/go-stomp/stomp/v3

基于golang 模块的基础使用

  • 生产者

连接到服务后使用Send方法发送消息

// 连接 ActiveMQ 服务
conn, err := stomp.Dial("tcp", "127.0.0.1:61613")
if err != nil {
   log.Fatalln("Dial Error :", err)
}

// 向 my_queue 队列中发送 Hello World
err = conn.Send("my_queue", "text/plain", []byte("Hello World"), nil)
if err != nil {
   log.Fatalln("Failed Send :", err)
}
  • 消费者

连接到服务后,订阅需要处理的队列,通过管道接受新的消息。这里需要注意一点,消费者长时间(默认10s)未接受到消息后会提示连接超时并断开连接,这里有两个处理方法:

方法一:在options中配置一个较长时间段的连接

var options []func(*stomp.Conn) error = []func(*stomp.Conn) error{
   stomp.ConnOpt.RcvReceiptTimeout(time.Duration(60) * time.Second), // 消费者连接时长
}

方法二:在提示连接超时时,进行重连、重新订阅这两个操作

// 连接 ActiveMQ 服务
conn, err := stomp.Dial("tcp", "127.0.0.1:61613", options...)
if err != nil {
   log.Fatalln("Dial Error :", err)
}

// 订阅 my_queue 队列,进行自动 ACK
sub, err := conn.Subscribe("my_queue", stomp.AckAuto)
if err != nil {
   log.Println("Subscribe Error :", err)
}

for {
   msg := <- sub.C
   if msg.Err != nil {
      // TODO: 重连
   } else {
      // 接受消息,执行业务逻辑
      fmt.Println(string(msg.Body))
   }
}