我试图覆盖文档中概述的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&java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory&java.naming.provider.url=file:bindings&transport.jms.DestinationType=queue"/>
</endpoint>
答案 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&java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory&java.naming.provider.url=file:bindings&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>