好的,阿杰,我帮你整理一份 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 消息类型

  1. TextMessage:传输文本
  2. ObjectMessage:传输 Java 对象(实现 Serializable)
  3. BytesMessage:传输字节流
  4. MapMessage:传输键值对
  5. 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 注意事项

  1. 消息确认模式
    • Session.AUTO_ACKNOWLEDGE 自动确认
    • Session.CLIENT_ACKNOWLEDGE 手动确认
  2. 持久化与非持久化
    • Queue 默认持久化,Topic 可选择持久订阅
  3. 事务支持
    • session.createSession(true, Session.SESSION_TRANSACTED) 支持事务
  4. 连接池
    • 大量并发推荐使用连接池(ActiveMQConnectionFactory / PooledConnectionFactory)

7️⃣ 总结

  • JMS 是 Java 的标准消息服务 API,适用于异步、解耦系统
  • 核心概念:生产者、消费者、消息、队列、主题
  • 常用模式
    • Queue(点对点):一对一
    • Topic(发布订阅):一对多
  • 常用中间件:ActiveMQ、RabbitMQ(JMS 接口)、IBM MQ