配置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版本不兼容:
- WSO2 Micro Integrator 4.2.0基于Java 11,默认依赖JMS 2.0 API,
Connection.createSession(boolean, int)是JMS 2.0新增的方法。 - 你使用的
aqapi-11.1.1.2.0.jar、jmscommon-9i.jar是基于JMS 1.1的旧版本,这些jar中的javax.jms.Connection类没有实现JMS 2.0的该方法,导致运行时找不到对应方法抛出异常。 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
相关产品推荐
相关产品推荐

