当前位置:首页 > 技术 > 正文内容

ActiveMQ 基础实践指南

访客 技术 2026年7月13日 5
ActiveMQ 是由 Apache 开发的一款开源消息中间件,完全遵循 JMS 1.1 和 J2EE 1.4 规范,为分布式系统提供异步通信能力。作为消息队列的成熟实现,它在企业级应用中仍扮演关键角色。
JMS(Java Message Service)是 Java 平台上用于面向消息中间件的 API,支持跨应用和分布式系统的消息传递。与 JDBC 类似,JMS 提供厂商无关的接口,可对接 IBM MQSeries、BEA Weblogic JMS 等不同实现。
本文演示 ActiveMQ 的基本使用。首先从 官网 下载并解压,确保已配置 Java 环境。启动服务后,访问 http://localhost:8161/admin,使用默认凭据 admin/admin 登录(凭据在 conf/users.properties 中定义)。登录界面如下:
ActiveMQ 管理界面
接下来,通过 Maven 项目引入依赖:
<dependencies>
    <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-all</artifactId>
        <version>${active-mq-version}</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

点对点消息收发

1. 消息发送

实现步骤:创建连接工厂 → 建立连接 → 开启会话 → 定义队列 → 生成生产者 → 发送消息。

首先初始化组件:

private static ConnectionFactory factory;
private static Connection connection;
private static Session session;
private static Destination destination;
private static MessageProducer producer;

创建连接工厂并配置默认参数:

private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
private static final String BROKER_URL = ActiveMQConnection.DEFAULT_BROKER_URL;
factory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKER_URL);

发送方法实现:

public static boolean sendMessage(String queueName, String content) {
    boolean success = true;
    try {
        connection = factory.createConnection();
        connection.start();
        session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
        destination = session.createQueue(queueName);
        producer = session.createProducer(destination);
        TextMessage msg = session.createTextMessage(content);
        producer.send(msg);
        session.commit();
    } catch (JMSException e) {
        e.printStackTrace();
        success = false;
    } finally {
        if (connection != null) {
            try { connection.close(); } catch (JMSException e) { e.printStackTrace(); }
        }
    }
    return success;
}

createSession 参数说明:

  • 第一个参数(事务):true 启用事务,忽略第二个参数;false 禁用事务。
  • 第二个参数(确认模式):
    • Session.AUTO_ACKNOWLEDGE:自动确认
    • Session.CLIENT_ACKNOWLEDGE:客户端调用 acknowledge() 确认
    • Session.DUPS_OK_ACKNOWLEDGE:允许重复确认

2. 消息接收

步骤与发送类似,但使用消费者替代生产者。

public static void receiveMessage(String queueName) {
    try {
        connection = factory.createConnection();
        connection.start();
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        destination = session.createQueue(queueName);
        MessageConsumer consumer = session.createConsumer(destination);
        while (true) {
            TextMessage msg = (TextMessage) consumer.receive();
            if (msg != null) {
                System.out.println(queueName + " 收到消息:" + msg.getText());
            }
        }
    } catch (Exception e) {
        System.err.println("消息接收异常");
    } finally {
        if (connection != null) {
            try { connection.close(); } catch (JMSException e) { e.printStackTrace(); }
        }
    }
}

receive() 提供了三种阻塞模式:receive()(持续等待)、receive(1000)(等待1秒)、receiveNoWait()(不等待)。

3. 使用监听器

通过 MessageListener 接口实现异步监听:

public class MsgListener implements MessageListener {
    private String queueName;

    public MsgListener(String queueName) {
        this.queueName = queueName;
    }

    @Override
    public void onMessage(Message msg) {
        if (msg instanceof TextMessage) {
            try {
                System.out.println("【" + queueName + "】消息:" + ((TextMessage) msg).getText());
            } catch (JMSException e) {
                System.err.println("消息解析失败");
            }
        }
    }
}

改造接收方法,应用监听器:

public static void receiveWithListener(String queueName) {
    try {
        connection = factory.createConnection();
        connection.start();
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        destination = session.createQueue(queueName);
        MessageConsumer consumer = session.createConsumer(destination);
        consumer.setMessageListener(new MsgListener(queueName));
        Thread.sleep(Long.MAX_VALUE); // 保持监听
    } catch (Exception e) {
        System.err.println("监听异常");
    } finally {
        if (connection != null) {
            try { connection.close(); } catch (JMSException e) { e.printStackTrace(); }
        }
    }
}

发布订阅模式

相比点对点模式,唯一区别是使用 session.createTopic() 替代 session.createQueue()

destination = session.createTopic(topicName);

其余逻辑(连接创建、会话配置、生产者/消费者使用)保持一致,此处不再重复。完整示例代码可参考 GitHub 仓库

标签: ActiveMQ

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。