WSO2: переопределить свойства JNDI производителя JMS для MQ - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь переопределить свойства соединения 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 голосов
/ 06 февраля 2019

Наконец-то найдено решение: документация WSO2 (как обычно) неполная и в этом случае некорректная.

Прежде всего, второй производитель JMS должен иметь CacheLevel выше SESSION (т. Е. Значение установлено на * 1003).* auto , потребитель или производитель в 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 и not transport.jms.ConnectionFactoryJNDIName .

Кроме того, значение параметра относится к общему внутреннему axis2 имени фабрики соединений, т.е. secondConnectionFactory в приведенном выше примере вместо имени JNDI MYQUEUEQCF.

Таким образом, при следующей конфигурации сообщение корректно отправляется во вторую очередь:

<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>
0 голосов
/ 05 февраля 2019

Не уверен, что это то же самое в 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>
...