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

配置WSO2 Micro Integrator与Oracle AQ时遇NoSuchMethodError求助

问题描述

按照博客配置WSO2 Micro Integrator 4.2.0与Oracle AQ,已创建代理服务和入站端点,但运行时抛出以下错误:

ERROR {TaskQuartzJobAdapter} - Error in executing task: 'javax.jms.Session javax.jms.Connection.createSession(boolean, int)' java.lang.NoSuchMethodError: 'javax.jms.Session javax.jms.Connection.createSession(boolean, int)'
    at org.wso2.carbon.inbound.endpoint.protocol.jms.factory.JMSConnectionFactory.createSession(JMSConnectionFactory.java:469)
    at org.wso2.carbon.inbound.endpoint.protocol.jms.factory.CachedJMSConnectionFactory.createSession(CachedJMSConnectionFactory.java:113)
    at org.wso2.carbon.inbound.endpoint.protocol.jms.factory.CachedJMSConnectionFactory.getSession(CachedJMSConnectionFactory.java:105)
    at org.wso2.carbon.inbound.endpoint.protocol.jms.JMSPollingConsumer.poll(JMSPollingConsumer.java:246)
    at org.wso2.carbon.inbound.endpoint.protocol.jms.JMSPollingConsumer.execute(JMSPollingConsumer.java:203)
    at org.wso2.carbon.inbound.endpoint.protocol.jms.JMSTask.taskExecute(JMSTask.java:46)
    at org.wso2.carbon.inbound.endpoint.common.InboundTask.execute(InboundTask.java:43)
    at org.wso2.micro.integrator.mediation.ntask.NTaskAdapter.execute(NTaskAdapter.java:105)
    at org.wso2.micro.integrator.ntask.core.impl.TaskQuartzJobAdapter.execute(TaskQuartzJobAdapter.java:63)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:829)

已添加到<MI_HOME>/lib目录的jar包:

  • aqapi-11.1.1.2.0.jar
  • jta-1.1.jar
  • jmscommon-9i.jar
  • ojdbc7.jar
    测试环境为Oracle 12c Docker镜像。

原因分析

该错误核心是JMS API版本不兼容:

  1. WSO2 Micro Integrator 4.2.0基于Java 11,默认依赖JMS 2.0 API,Connection.createSession(boolean, int)是JMS 2.0新增的方法。
  2. 你使用的aqapi-11.1.1.2.0.jar、jmscommon-9i.jar是基于JMS 1.1的旧版本,这些jar中的javax.jms.Connection类没有实现JMS 2.0的该方法,导致运行时找不到对应方法抛出异常。
  3. ojdbc7.jar适配Java 7,和Java 11环境存在兼容性问题,同时无法支持JMS 2.0的调用逻辑。

解决方法

1. 替换兼容的Oracle AQ客户端jar包

  • 移除旧jar包:删除<MI_HOME>/lib下的aqapi-11.1.1.2.0.jar、jmscommon-9i.jar、ojdbc7.jar、jta-1.1.jar(WSO2 MI已内置兼容的JTA实现,无需额外添加)。
  • 添加适配Oracle 12c和JMS 2.0的jar包:
    • ojdbc8.jar:适配Oracle 12cR2及以上版本,兼容Java 11。
    • aqapi.jar:从Oracle 12c安装目录的$ORACLE_HOME/rdbms/jlib路径获取,该版本原生支持JMS 2.0。

2. 修正入站端点配置

确保入站端点配置使用Oracle AQ专属的上下文工厂和正确的JMS参数,示例配置如下:

<inboundEndpoint name="OracleAQInbound" onError="fault" protocol="jms" sequence="processAQMessage" suspend="false">
    <parameters>
        <parameter name="interval">1000</parameter>
        <parameter name="transport.jms.ConnectionFactoryJNDIName">java:/OracleAQConnectionFactory</parameter>
        <parameter name="transport.jms.Destination">YOUR_QUEUE_NAME</parameter>
        <parameter name="transport.jms.ConnectionFactoryType">queue</parameter>
        <parameter name="transport.jms.UserName">DB_USERNAME</parameter>
        <parameter name="transport.jms.Password">DB_PASSWORD</parameter>
        <parameter name="java.naming.factory.initial">oracle.jms.AQjmsInitialContextFactory</parameter>
        <parameter name="java.naming.provider.url">jdbc:oracle:thin:@<DB_HOST>:<DB_PORT>:<SID></parameter>
        <parameter name="transport.jms.SessionAcknowledgement">AUTO_ACKNOWLEDGE</parameter>
        <parameter name="transport.jms.SessionTransacted">false</parameter>
    </parameters>
</inboundEndpoint>

3. 重启Micro Integrator

替换jar包和修改配置后,必须重启WSO2 Micro Integrator,确保新的类和配置生效。

内容的提问来源于stack exchange,提问作者L.Malsha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:06:13