简体   繁体   English

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

[英]Using Websphere AS JMS resources from embedded Mule

I'm trying to use managed JMS resources of WAS in embedded Mule ESB, with jms connector as below: 我正在尝试通过jms连接器在嵌入式Mule ESB中使用WAS的托管JMS资源,如下所示:

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

Connection factory is found by Mule with no problem, but when trying to get connection Mule ends up with the following: 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)

Any guess about how this could be resolved? 关于如何解决的任何猜测?

Does Mule really need to set this ExceptionListener or it could be skipped somehow? Mule是否真的需要设置此ExceptionListener,否则可能会被跳过?

Finally I found a way to get rid of this exception, by simply adding this into connector definition: 最终,我找到了摆脱此异常的方法,只需将其添加到连接器定义中即可:

cacheJmsSessions="false"

This could not be set from the interface because of default true and checkbox control provided, but still could be added manually into XML. 由于提供了默认的true和复选框控制,因此无法从界面中进行设置,但仍可以手动将其添加到XML中。

This option being set to false skips creation of connection factory decorator (CustomCachingConnectionFactory), so the connection is OK after that. 将此选项设置为false会跳过连接工厂装饰器(CustomCachingConnectionFactory)的创建,因此此后连接正常。

But anyway, Mule then fails with message consumer as follows: 但是无论如何,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)

It happens because Mule embedded disrespects j2ee specification, which states that methods such as getMessageListener/setMessageListener could not be called from EE/Web containers. 发生这种情况是因为Mule嵌入式不尊重j2ee规范,该规范指出无法从EE / Web容器调用诸如getMessageListener / setMessageListener之类的方法。

So it looks rather impossible to use standard JMS connector with Websphere. 因此,将标准JMS连接器与Websphere一起使用似乎不太可能。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM