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&java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory&java.naming.provider.url=file:bindings&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(即值设置为 auto、consumer 或 生产者在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&java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory&java.naming.provider.url=file:bindings&transport.jms.DestinationType=queue"/>
</endpoint>
我正在尝试覆盖文档中概述的 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&java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory&java.naming.provider.url=file:bindings&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(即值设置为 auto、consumer 或 生产者在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&java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory&java.naming.provider.url=file:bindings&transport.jms.DestinationType=queue"/>
</endpoint>