好的,阿杰,我帮你整理一份 JMS(Java 消息服务)入门教程,从基础概念、核心组件,到示例代码和常用模式,适合初学者快速入门。
JMS(Java 消息服务)入门教程
1️⃣ JMS 简介
- 全称:Java Message Service
- 作用:Java 提供的 消息中间件接口规范,用于在应用之间异步传递消息
- 特点:
- 松耦合:生产者和消费者不直接依赖
- 异步通信:提高系统吞吐量
- 可保证消息可靠性和顺序
2️⃣ JMS 的核心概念
概念 | 说明 |
---|---|
消息生产者(Producer) | 负责发送消息 |
消息消费者(Consumer) | 负责接收消息 |
消息(Message) | JMS 传递的对象,可以是文本、对象或字节 |
目的地(Destination) | 消息的目标,有两种类型:队列(Queue)和主题(Topic) |
会话(Session) | 线程单元,用于创建生产者、消费者和消息 |
连接(Connection) | 与消息服务器的连接 |
连接工厂(ConnectionFactory) | 创建 Connection 的工厂类 |
3️⃣ JMS 消息类型
- TextMessage:传输文本
- ObjectMessage:传输 Java 对象(实现 Serializable)
- BytesMessage:传输字节流
- MapMessage:传输键值对
- StreamMessage:传输原始 Java 数据流
4️⃣ JMS 模型
4.1 点对点模型(P2P, Queue)
- 一个消息只能被 一个消费者 接收
- 队列保证消息顺序
- 使用场景:订单处理、任务队列
Producer → Queue → Consumer
4.2 发布/订阅模型(Pub/Sub, Topic)
- 消息发布给 所有订阅者
- 消费者可以异步接收消息
- 使用场景:新闻推送、实时通知
Producer → Topic → Subscriber1
Subscriber2
5️⃣ JMS 编程基础(示例)
这里以 ActiveMQ 为例(流行的开源消息中间件)
5.1 Maven 依赖
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.16.6</version>
</dependency>
5.2 点对点示例(Queue)
生产者
import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;
public class QueueProducer {
public static void main(String[] args) throws JMSException {
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("test-queue");
MessageProducer producer = session.createProducer(queue);
TextMessage message = session.createTextMessage("Hello JMS Queue!");
producer.send(message);
producer.close();
session.close();
connection.close();
System.out.println("消息发送成功!");
}
}
消费者
import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;
public class QueueConsumer {
public static void main(String[] args) throws JMSException {
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("test-queue");
MessageConsumer consumer = session.createConsumer(queue);
consumer.setMessageListener(msg -> {
if (msg instanceof TextMessage) {
try {
System.out.println("收到消息: " + ((TextMessage) msg).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
System.out.println("等待消息...");
}
}
5.3 发布/订阅示例(Topic)
生产者
Topic topic = session.createTopic("test-topic");
MessageProducer producer = session.createProducer(topic);
producer.send(session.createTextMessage("Hello JMS Topic!"));
消费者
Topic topic = session.createTopic("test-topic");
MessageConsumer consumer = session.createConsumer(topic);
consumer.setMessageListener(...); // 同上
注意:订阅者必须在消息发送前订阅,才能收到消息(非持久订阅除外)
6️⃣ JMS 注意事项
- 消息确认模式
Session.AUTO_ACKNOWLEDGE
自动确认Session.CLIENT_ACKNOWLEDGE
手动确认
- 持久化与非持久化
- Queue 默认持久化,Topic 可选择持久订阅
- 事务支持
session.createSession(true, Session.SESSION_TRANSACTED)
支持事务
- 连接池
- 大量并发推荐使用连接池(ActiveMQConnectionFactory / PooledConnectionFactory)
7️⃣ 总结
- JMS 是 Java 的标准消息服务 API,适用于异步、解耦系统
- 核心概念:生产者、消费者、消息、队列、主题
- 常用模式:
- Queue(点对点):一对一
- Topic(发布订阅):一对多
- 常用中间件:ActiveMQ、RabbitMQ(JMS 接口)、IBM MQ
发表回复