在Java项目里接入消息中间件,ActiveMQ是最容易上手的方案之一。它实现了JMS规范,提供了独立的broker服务,开发者只需在客户端引入对应依赖并建立连接,就能完成异步消息的发送与接收。下面直接说明从零开始搭建ActiveMQ客户端的具体步骤。

一、准备Maven依赖
搭建客户端的第一步是在工程中引入ActiveMQ提供的JMS客户端包。以往有些团队会错误地引入activemq-all这种包含所有模块的巨型包,导致与其他日志框架或Spring版本产生冲突。更合理的做法是只引入核心客户端依赖,保持依赖树的干净。
下面给出一份标准的Maven依赖配置,其中activemq-client包含了连接broker所需的基础类,而javax.jms-api则提供了JMS规范接口。两者配合即可脱离任何应用服务器独立运行。
<dependencies>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
<version>5.18.3</version>
</dependency>
<dependency>
<groupId>javax.jms</groupId>
<artifactId>javax.jms-api</artifactId>
<version>2.0.1</version>
</dependency>
</dependencies>
引入依赖后,如果项目使用JDK 11及以上版本,需要注意javax命名空间已被部分模块移除,此时可改用jakarta.jms-api。不过对于学习ActiveMQ基础搭建而言,上述Javax配置在JDK 8环境中最为稳定。
二、建立连接工厂与连接
ActiveMQ的客户端通过ConnectionFactory创建到broker的物理连接。最常见的实现类是ActiveMQConnectionFactory,其构造参数接收broker的URL、用户名与密码。本地默认broker地址为tcp://127.0.0.1:61616,若未修改安装配置可直接使用。
建立连接后必须调用start方法激活,否则消息无法传输。很多初学者写完代码发现收不到消息,原因就是漏掉了connection.start()。另外连接属于重量级资源,使用完毕要确保在finally块或try-with-resources中关闭,避免端口与线程泄漏。
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.Connection;
import javax.jms.JMSException;
public class ConnectDemo {
public static Connection createConnection() throws JMSException {
ActiveMQConnectionFactory factory =
new ActiveMQConnectionFactory("tcp://127.0.0.1:61616", "admin", "admin");
Connection connection = factory.createConnection();
connection.start();
return connection;
}
}
上述代码把连接创建逻辑封装成方法,实际业务中可交给连接池管理。ActiveMQ也提供了PooledConnectionFactory来复用连接,在高并发场景能显著降低握手开销。
三、发送队列消息示例
JMS中消息发送依赖于Session与MessageProducer。Session提供事务与确认模式配置,对于基础教程采用自动确认即可。Destination分为Queue与Topic,对应点对点和发布订阅模型。
以下示例创建名为test.queue的队列,并发送一条文本消息。注意发送完毕后要提交或关闭session,否则消息可能滞留在客户端缓冲区。文本消息通过session.createTextMessage构建,支持中文内容。
import javax.jms.*;
public class QueueSender {
public static void main(String[] args) throws JMSException {
ActiveMQConnectionFactory factory =
new ActiveMQConnectionFactory("tcp://127.0.0.1:61616", "admin", "admin");
try (Connection conn = factory.createConnection()) {
conn.start();
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("test.queue");
MessageProducer producer = session.createProducer(queue);
TextMessage msg = session.createTextMessage("你好,ActiveMQ");
producer.send(msg);
System.out.println("消息已发送");
session.close();
}
}
}
运行该程序前,需确保本地已启动ActiveMQ broker。启动后访问管理后台可看到队列中多了一条待消费消息。这种点对点模式适合订单处理、邮件通知等任务分发场景。
四、消费消息与模型对比
消息消费通过MessageConsumer完成,可使用同步receive或异步MessageListener。下面的代码采用同步阻塞方式读取一条消息,适合脚本类工具。若做服务常驻,推荐实现MessageListener接口以异步处理。
import javax.jms.*;
public class QueueReceiver {
public static void main(String[] args) throws JMSException {
ActiveMQConnectionFactory factory =
new ActiveMQConnectionFactory("tcp://127.0.0.1:61616", "admin", "admin");
try (Connection conn = factory.createConnection()) {
conn.start();
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("test.queue");
MessageConsumer consumer = session.createConsumer(queue);
Message message = consumer.receive(5000);
if (message instanceof TextMessage) {
System.out.println("收到: " + ((TextMessage) message).getText());
}
session.close();
}
}
}
除队列外,若把Destination换成Topic,就变成发布订阅模型。两者核心差异在于:队列中一条消息只能被一个消费者处理,而主题消息会广播给所有在线订阅者。日志推送、行情广播适合用Topic,而扣款指令必须走Queue保证不重复处理。
五、常见配置误区与资源清理
新手常把broker URL写成http协议,这是错误写法,ActiveMQ原生传输使用tcp或vm协议。另外在代码里硬编码用户名密码不利于多环境切换,应通过配置文件注入。
最后强调资源释放顺序:先关consumer与producer,再关session,最后关connection。若使用try-with-resources语法,Java会自动按相反顺序关闭,降低出错概率。搭好这套基础环境后,便可继续研究持久化、消息过滤与集群配置。
| 配置项 | 常见错误 | 正确做法 |
|---|---|---|
| broker URL | 使用http://开头 | 使用tcp://127.0.0.1:61616 |
| 连接启动 | 忘记调用start | 创建后立即start |
| 资源释放 | 只关connection | 逐级关闭或用try-with-resources |
ActiveMQJava_message_serviceJMS修改时间:2026-08-06 21:22:34