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

时间:2019-02-05 12:24:21

标签: wso2 jms wso2esb wso2ei

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

  

您可以在JMS连接URL中定义JMS队列名称和连接工厂参数。连接工厂参数的值取决于JMS代理的类型。

我在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>

2 个答案:

答案 0 :(得分:0)

最终找到了解决方案:WSO2文档(通常)不完整,在这种情况下,不正确。

首先,第二个JMS生产者必须具有高于SESSION的CacheLevel(即,<<>中的值设置为自动消费者生产者强大的> 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>

答案 1 :(得分:-1)

不确定在EI 6.x下是否相同,但是对于esb 4.8,您必须定义第二个传输发件人,然后在发送/端点中引用。

        <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>