【问题标题】:WSO2: Override JMS producer JNDI properties for MQWSO2:覆盖 MQ 的 JMS 生产者 JNDI 属性
【发布时间】:2019-06-29 06:29:01
【问题描述】:

我正在尝试覆盖文档中概述的 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>

【问题讨论】:

  • 在最新的 EI 版本 6.4.0 上运行

标签: wso2 jms wso2esb wso2ei


【解决方案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>

【讨论】:

  • 谢谢,但这是一个不好的方法。然后,每个环境将有 4-5 个发件人,每个人都有自己的绑定文件。此外,对于其他开发人员来说,在查看 EPR 时,尤其是在使用其他定义的代理服务中,发生了什么变得非常不清楚。已经可以在同一个 JMS 传输发送方/接收方下定义多个连接工厂 - 这就是为什么它们在示例中具有默认和自定义的原因。问题是队列名称之后的命令和?即使它们应该起作用,也不会产生任何影响。这是正确的方法。
【解决方案2】:

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

首先,第二个JMS生产者的CacheLevel必须高于SESSION(即值设置为autoconsumerproducer在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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2015-06-15
    • 1970-01-01
    • 2021-11-08
    • 2017-12-18
    • 2016-04-23
    相关资源
    最近更新 更多