【问题标题】:Using Websphere AS JMS resources from embedded Mule使用来自嵌入式 Mule 的 Websphere AS JMS 资源
【发布时间】:2017-01-28 21:06:49
【问题描述】:

我正在尝试在嵌入式 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 或者它可能会被某种方式跳过?

【问题讨论】:

    标签: java jms mule websphere


    【解决方案1】:

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

    cacheJmsSessions="false"
    

    由于默认的 true 和提供的复选框控件,无法从界面设置,但仍可以手动添加到 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 连接器似乎是不可能的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-14
      • 2011-10-30
      • 2019-03-18
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多