导读:本期聚焦于小伙伴创作的《XML与消息队列如何结合?JMS中怎么使用XML传递消息》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《XML与消息队列如何结合?JMS中怎么使用XML传递消息》有用,将其分享出去将是对创作者最好的鼓励。

XML凭借自描述、跨平台、结构清晰的特点,常被用作分布式系统间的数据交换格式,而消息队列能实现系统间的异步通信和解耦,两者结合可以满足复杂业务场景下的数据传递需求。JMS作为Java生态中标准的消息服务规范,提供了统一的消息操作接口,支持通过文本消息类型承载XML数据,实现不同Java系统之间的结构化信息传递。

XML与消息队列如何结合?JMS中怎么使用XML传递消息

XML与消息队列结合的核心逻辑

XML和消息队列的结合本质是将XML字符串作为消息的载体内容,消息队列负责传输这个字符串,接收方拿到消息后再解析XML获取业务数据。这种方式的优势在于XML的结构化特性可以让消息内容具备明确的语义,不需要额外约定复杂的二进制格式,同时消息队列的异步特性可以避免发送方和接收方直接耦合。

结合的基本流程

  • 发送方按照业务需求构造XML格式的字符串,确保XML语法合法
  • 发送方将XML字符串封装到消息队列支持的文本类型消息中
  • 发送方通过消息队列客户端将消息发送到指定的队列或主题
  • 接收方从消息队列中拉取或订阅对应的消息
  • 接收方从消息中提取XML字符串,解析XML获取业务数据并处理

JMS中使用XML传递消息的实现

JMS定义了多种消息类型,其中TextMessage专门用于传递文本类数据,非常适合承载XML格式的字符串。下面以ActiveMQ作为JMS实现中间件,演示完整的XML消息生产和消费过程。

环境准备

首先需要在项目中引入JMS和ActiveMQ的相关依赖,以Maven项目为例,添加以下依赖配置:

<dependencies>
    <!-- JMS API依赖 -->
    <dependency>
        <groupId>javax.jms</groupId>
        <artifactId>javax.jms-api</artifactId>
        <version>2.0.1</version>
    </dependency>
    <!-- ActiveMQ连接工厂依赖 -->
    <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-client</artifactId>
        <version>5.18.3</version>
    </dependency>
</dependencies>

XML消息生产者实现

生产者负责构造XML字符串,将其封装为TextMessage并发送到JMS队列中,代码如下:

import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;

public class XmlMessageProducer {
    // JMS中间件地址,本地测试使用默认地址
    private static final String BROKER_URL = "tcp://127.0.0.1:61616";
    // 目标队列名称
    private static final String QUEUE_NAME = "xml_message_queue";

    public static void main(String[] args) {
        ConnectionFactory connectionFactory = null;
        Connection connection = null;
        Session session = null;
        MessageProducer producer = null;

        try {
            // 1. 创建连接工厂
            connectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
            // 2. 创建连接并启动
            connection = connectionFactory.createConnection();
            connection.start();
            // 3. 创建会话,参数1为是否开启事务,参数2为消息确认模式
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            // 4. 创建目标队列
            Destination destination = session.createQueue(QUEUE_NAME);
            // 5. 创建消息生产者
            producer = session.createProducer(destination);
            // 6. 构造XML格式的字符串,这里模拟用户注册的消息内容
            String xmlContent = "<user>" +
                    "<id>1001</id>" +
                    "<name>张三</name>" +
                    "<age>25</age>" +
                    "<email>test@ipipp.com</email>" +
                    "</user>";
            // 7. 创建TextMessage并放入XML内容
            TextMessage textMessage = session.createTextMessage(xmlContent);
            // 8. 发送消息
            producer.send(textMessage);
            System.out.println("XML消息发送成功,内容:" + xmlContent);
        } catch (JMSException e) {
            e.printStackTrace();
        } finally {
            // 9. 关闭资源
            try {
                if (producer != null) producer.close();
                if (session != null) session.close();
                if (connection != null) connection.close();
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }
}

XML消息消费者实现

消费者从JMS队列中接收TextMessage,提取XML字符串后解析处理,代码如下:

import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class XmlMessageConsumer {
    private static final String BROKER_URL = "tcp://127.0.0.1:61616";
    private static final String QUEUE_NAME = "xml_message_queue";

    public static void main(String[] args) {
        ConnectionFactory connectionFactory = null;
        Connection connection = null;
        Session session = null;
        MessageConsumer consumer = null;

        try {
            connectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
            connection = connectionFactory.createConnection();
            connection.start();
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            Destination destination = session.createQueue(QUEUE_NAME);
            // 创建消息消费者
            consumer = session.createConsumer(destination);
            // 注册消息监听器,异步接收消息
            consumer.setMessageListener(new MessageListener() {
                @Override
                public void onMessage(Message message) {
                    if (message instanceof TextMessage) {
                        try {
                            TextMessage textMessage = (TextMessage) message;
                            String xmlContent = textMessage.getText();
                            System.out.println("接收到XML消息:" + xmlContent);
                            // 解析XML内容
                            parseXml(xmlContent);
                        } catch (JMSException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
            // 保持程序运行,等待接收消息
            Thread.sleep(10000);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (consumer != null) consumer.close();
                if (session != null) session.close();
                if (connection != null) connection.close();
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }

    // 解析XML字符串的示例方法
    private static void parseXml(String xmlContent) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 将字符串转为Document对象
            Document document = builder.parse(new java.io.ByteArrayInputStream(xmlContent.getBytes("UTF-8")));
            // 获取user节点下的子节点内容
            NodeList idNodes = document.getElementsByTagName("id");
            NodeList nameNodes = document.getElementsByTagName("name");
            NodeList ageNodes = document.getElementsByTagName("age");
            NodeList emailNodes = document.getElementsByTagName("email");

            if (idNodes.getLength() > 0 && nameNodes.getLength() > 0) {
                String id = idNodes.item(0).getTextContent();
                String name = nameNodes.item(0).getTextContent();
                String age = ageNodes.item(0).getTextContent();
                String email = emailNodes.item(0).getTextContent();
                System.out.println("解析到的用户信息:id=" + id + ", name=" + name + ", age=" + age + ", email=" + email);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意事项与适用场景

注意事项

  • XML字符串需要保证语法合法,避免出现未闭合的标签、特殊字符未转义等问题,否则接收方解析会失败
  • XML的内容编码建议统一使用UTF-8,避免不同系统之间编码不一致导致乱码
  • 如果XML内容过大,会增加消息队列的存储和传输压力,建议控制单个XML消息的大小,过大的数据可以考虑拆分或使用其他存储方式
  • JMS的TextMessage对字符串长度没有硬性限制,但要结合使用的中间件的最大消息限制调整

适用场景

这种结合方式适合跨平台、跨语言的系统间数据交互,比如Java系统和.NET系统之间通过消息队列传递业务数据,XML的自描述特性可以让双方不需要复杂的接口约定就能解析数据。也适合需要保留消息结构历史版本的场景,XML的标签扩展能力可以兼容后续的结构调整,不会破坏旧版本的消息处理逻辑。

需要注意的是,如果是对性能要求极高的场景,XML的解析开销和冗余标签会带来额外的性能损耗,此时可以考虑使用JSON等更轻量的格式替代。

XML消息队列JMS消息传递修改时间:2026-07-08 09:06:40

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。