携手创作,共同成长!这是我参与「掘金日新计划 · 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
就能够创建队列
- 创建主题
输入主题名称后,点击Create
创建主题
- 发送消息
参考以下页面可往指定的Topic中发送消息
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))
}
}