You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3.1.0迁移后ActiveMQ JMS选择器出现类找不到异常

Spring Boot 3.1.0迁移后JMS XPath选择器类找不到问题

问题重现

将带有XPath选择器的JMS监听器迁移至Spring Boot 3.1.0后,启动时抛出类找不到异常,无法加载默认XPath解析器。

相关代码与配置

JMS监听器代码

@JmsListener(destination = "${queue.demo.task.destination}", selector = "${queue.demo.task.selector}")
public void handle(@Payload String taskConfirmation, Message jmsMessage) throws JMSException {
    ActiveMQTextMessage activeMQTextMessage = (ActiveMQTextMessage)jmsMessage;
    LOGGER.debug(ListenerUtility.getLoginfo(activeMQTextMessage));
    messageService.createTaskDemo(taskConfirmation, jmsMessage.getJMSDestination().toString(), XYZ)
                  .subscribeOn(Schedulers.boundedElastic()).subscribe();
}

YAML配置

queue:
  demo:
    task:
      destination: ${default.queue.demo.task.destination:${namespace:default}.ABC}
      selector: "XPATH '//msg/Header/messageType=\"123\"'"

报错日志

2023-06-27 12:25:52,692 ERROR [o.a.activemq.filter.XPathExpression     ,Container#13-14]  (,,,,,) : Default XPath evaluator could not be loaded 

java.lang.ClassNotFoundException: org.apache.activemq.filter.JAXPXPathEvaluator
    at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:587)
    at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:133)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)

解决方案

原因

Spring Boot 3.1.0适配的ActiveMQ客户端版本中,JAXPXPathEvaluator类的包路径从org.apache.activemq.filter变更为org.apache.activemq.util,且默认依赖中不再包含XPath解析模块,导致类加载失败。

修复步骤

  1. 补充依赖
    如果使用Maven,在pom.xml中添加以下依赖:

    <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-xpath</artifactId>
    </dependency>
    

    Gradle项目则添加:

    implementation 'org.apache.activemq:activemq-client'
    implementation 'org.apache.activemq:activemq-xpath'
    
  2. 指定XPath解析类
    若添加依赖后仍有问题,通过系统属性指定新的解析类:

    • 在启动类中添加代码:
      System.setProperty("org.apache.activemq.xpath.evaluator", "org.apache.activemq.util.JAXPXPathEvaluator");
      
    • 或添加JVM启动参数:
      -Dorg.apache.activemq.xpath.evaluator=org.apache.activemq.util.JAXPXPathEvaluator
      
  3. 校验选择器格式
    YAML配置中选择器的转义写法可优化为单引号包裹,避免转义错误:

    selector: 'XPATH ''//msg/Header/messageType="123"'''
    

内容的提问来源于stack exchange,提问作者user2158105

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:04:55