使用来自嵌入式Mule的Websphere AS JMS资源

时间:2017-01-22 16:16:00

标签: java jms mule websphere

我正在尝试在嵌入式Mule ESB中使用WAS的托管JMS资源,jms连接器如下所示:

<jms:connector name="JMS" 
validateConnections="true" 
jndiInitialFactory="com.ibm.websphere.naming.WsnInitialContextFactory" 
connectionFactoryJndiName="jms/mycf" 
doc:name="JMS" 
specification="1.1" 
embeddedMode="true"/>

连接工厂由Mule找到没有问题,但是当试图获得连接时,Mule最终得到以下内容:

Caused by: javax.jms.IllegalStateException: Method setExceptionListener not permitted
at com.ibm.ejs.jms.JMSCMUtils.methodNotPermittedException(JMSCMUtils.java:244)
at com.ibm.ejs.jms.JMSConnectionHandle.checkRestrictedMethod(JMSConnectionHandle.java:854)
at com.ibm.ejs.jms.JMSConnectionHandle.setExceptionListener(JMSConnectionHandle.java:353)
at org.springframework.jms.connection.SingleConnectionFactory.prepareConnection(SingleConnectionFactory.java:395)
at org.springframework.jms.connection.SingleConnectionFactory.initConnection(SingleConnectionFactory.java:306)
at org.springframework.jms.connection.SingleConnectionFactory.getConnection(SingleConnectionFactory.java:283)
at org.springframework.jms.connection.SingleConnectionFactory.createConnection(SingleConnectionFactory.java:224)
at org.mule.transport.jms.Jms11Support.createConnection(Jms11Support.java:72)
at org.mule.transport.jms.JmsConnector.createConnection(JmsConnector.java:450)
at org.mule.transport.jms.JmsConnector.doConnect(JmsConnector.java:547)
at org.mule.transport.AbstractConnector.connectConnectorAndReceivers(AbstractConnector.java:1663)
at org.mule.transport.AbstractConnector$5.doWork(AbstractConnector.java:1629)
at org.mule.retry.policies.AbstractPolicyTemplate.execute(AbstractPolicyTemplate.java:63)

有关如何解决这个问题的任何猜测?

Mule真的需要设置这个ExceptionListener,还是可以以某种方式跳过它?

1 个答案:

答案 0 :(得分:0)

最后,我找到了一种摆脱这种异常的方法,只需将其添加到连接器定义中:

cacheJmsSessions="false"

由于提供了默认的true和checkbox控件,因此无法从界面设置,但仍可以手动添加到XML中。

此选项设置为false会跳过连接工厂装饰器(CustomCachingConnectionFactory)的创建,因此之后连接正常。

但无论如何,Mule随后消息消费者失败如下:

Caused by: org.mule.api.lifecycle.LifecycleException: Method getMessageListener not permitted
at org.mule.transport.jms.MultiConsumerJmsMessageReceiver$SubReceiver.doStart(MultiConsumerJmsMessageReceiver.java:325)
at org.mule.transport.jms.MultiConsumerJmsMessageReceiver.startSubReceivers(MultiConsumerJmsMessageReceiver.java:235)
at org.mule.transport.jms.MultiConsumerJmsMessageReceiver.doStart(MultiConsumerJmsMessageReceiver.java:114)
at org.mule.transport.AbstractMessageReceiver.doStartHandler(AbstractMessageReceiver.java:473)
at org.mule.transport.AbstractTransportMessageHandler$3.onTransition(AbstractTransportMessageHandler.java:321)
at org.mule.lifecycle.AbstractLifecycleManager.invokePhase(AbstractLifecycleManager.java:138)
at org.mule.transport.ConnectableLifecycleManager.fireStartPhase(ConnectableLifecycleManager.java:48)
at org.mule.transport.AbstractTransportMessageHandler.start(AbstractTransportMessageHandler.java:317)
at org.mule.transport.AbstractConnector.registerListener(AbstractConnector.java:1303)
at org.mule.endpoint.DefaultInboundEndpoint.start(DefaultInboundEndpoint.java:105)
... 77 more
Caused by: javax.jms.IllegalStateException: Method getMessageListener not permitted
at com.ibm.ejs.jms.JMSCMUtils.methodNotPermittedException(JMSCMUtils.java:244)
at com.ibm.ejs.jms.JMSMessageConsumerHandle.getMessageListener(JMSMessageConsumerHandle.java:369)
at org.mule.transport.jms.MultiConsumerJmsMessageReceiver$SubReceiver.doStart(MultiConsumerJmsMessageReceiver.java:316)

之所以发生这种情况,是因为Mule嵌入式不遵守j2ee规范,该规范声明无法从EE / Web容器调用getMessageListener / setMessageListener等方法。

因此,在Websphere中使用标准JMS连接器似乎是不可能的。