WSO2:覆盖 MQ 的 JMS 生产者 JNDI 属性

WSO2: Override JMS producer JNDI properties for MQ

我正在尝试覆盖文档中概述的 JMS 连接属性: https://docs.wso2.com/display/EI640/Using+the+ESB+as+a+JMS+Producer

You can define a JMS queue name and connection factory parameters in the JMS connection URL. Values of connection factory parameters depend on the type of the JMS broker.

我的 axis2.xml 文件中定义了多个队列连接工厂以支持多个队列管理器。但是下面的配置没有生效(消息没有发送到正确的队列环境):

<endpoint name="myEndpoint" xmlns="http://ws.apache.org/ns/synapse">
    <address format="pox" uri="jms://MY_QUEUE_NAME?transport.jms.ConnectionFactoryJNDIName=MYQUEUEQCF"/>
</endpoint>

axis2配置与上面匹配:

<transportSender name="jms" class="org.apache.axis2.transport.jms.JMSSender">

<parameter name="myConnectionFactory" locked="false">
        <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter>
        <parameter name="java.naming.provider.url" locked="false">file:bindings</parameter>
        <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">OTHERQCF</parameter>
        <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
        <parameter name="transport.jms.UserName" locked="false"></parameter>
        <parameter name="transport.jms.Password" locked="false"></parameter>
</parameter>

<parameter name="secondConnectionFactory" locked="false">
        <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter>
        <parameter name="java.naming.provider.url" locked="false">file:bindings</parameter>
        <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MYQUEUEQCF</parameter>
        <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
        <parameter name="transport.jms.UserName" locked="false"></parameter>
        <parameter name="transport.jms.Password" locked="false"></parameter>
</parameter>

</transportSender>

消息通过第一个连接工厂 OTHERQCF,而不是按预期通过 MYQUEUEQCF,因此它们被发送到错误的环境。使用的队列技术是 WebSphere MQ。

这是一个错误还是我遗漏了什么?

我也尝试过以下配置,但没有生效:

<endpoint name="myEndpoint" xmlns="http://ws.apache.org/ns/synapse">
    <address format="pox" uri="jms://MY_QUEUE_NAME?transport.jms.ConnectionFactoryJNDIName=MYQUEUEQCF&amp;java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory&amp;java.naming.provider.url=file:bindings&amp;transport.jms.DestinationType=queue"/>
</endpoint>

不确定在 EI 6.x 下是否相同,但对于 esb 4.8,您必须定义第二个传输发送方 然后在 send/endpoint.

        <transportSender name="jmsSecond" class="org.apache.axis2.transport.jms.JMSSender">

           <parameter name="secondConnectionFactory" .....

    </transportSender>


<endpoint name="myEndpoint" xmlns="http://ws.apache.org/ns/synapse">
    <address format="pox" uri="jmsSecond://MY_QUEUE_NAME?transport.jms.ConnectionFactoryJNDIName=MYQUEUEQCF"/>
</endpoint>

终于找到了解决方案:WSO2 文档(像往常一样)不完整,在这种情况下是不正确的。

首先,第二个 JMS 生产者的 CacheLevel 必须高于 SESSION(即值设置为 autoconsumer生产者axis.xml配置中,例如:

<parameter name="secondConnectionFactory" locked="false">
    <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter>
    <parameter name="java.naming.provider.url" locked="false">file:bindings</parameter>
    <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MYQUEUEQCF</parameter>
    <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
    <parameter name="transport.jms.UserName" locked="false"></parameter>
    <parameter name="transport.jms.Password" locked="false"></parameter>
    <parameter name="transport.jms.CacheLevel" locked="false">producer</parameter>
</parameter>

这是因为 JMSProducer 否则将根据 github 上的代码转为使用默认连接工厂。

其次,文档中的参数名称不正确。要使用的参数称为 transport.jms.ConnectionFactory 而不是 transport.jms.ConnectionFactoryJNDIName

此外,参数值指的是连接工厂的整个内部 axis2 名称,即上面示例中的 secondConnectionFactory,而不是 MYQUEUEQCF JNDI 名称。

所以通过以下配置,消息被正确发送到第二个队列:

<endpoint name="myEndpoint" xmlns="http://ws.apache.org/ns/synapse">
    <address format="pox" uri="jms://MY_QUEUE_NAME?transport.jms.ConnectionFactory=secondConnectionFactory&amp;java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory&amp;java.naming.provider.url=file:bindings&amp;transport.jms.DestinationType=queue"/>
</endpoint>