0
votes

Using a proxy-service listening on a jms queue in wso2esb-5.0.0, how do I use the activemq consumer.exclusive=true property ? I have the following configuration in axis2.xml :

<transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener">
    <parameter name="default" locked="false">
    <parameter name="java.naming.factory.initial" locked="false">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>
    <parameter name="java.naming.provider.url" locked="false">failover:(tcp://V1-AMQ01:61616,tcp://V1-AMQ02:61616)?jms.nonBlockingRedelivery=true&amp;nested.consumer.exclusive=true</parameter>
    <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>
    <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
    <parameter name="transport.jms.SessionTransacted">true</parameter>
    <parameter name="transport.jms.SessionAcknowledgement" locked="true">CLIENT_ACKNOWLEDGE</parameter>
    <parameter name="transport.Transactionality" locked="true">local</parameter>
    <parameter name="redeliveryPolicy.maximumRedeliveries" locked="true">-1</parameter>
    <parameter name="redeliveryPolicy.redeliveryDelay">4000</parameter>
    <parameter name="transport.jms.CacheLevel" locked="true">consumer</parameter>
    <parameter name="redeliveryPolicy.initialRedeliveryDelay">4000</parameter>
    <parameter name="redeliveryPolicy.maximumRedeliveryDelay">864000</parameter>
    <parameter name="redeliveryPolicy.useExponentialBackOff">true</parameter>
    <parameter name="redeliveryPolicy.backOffMultiplier">3</parameter>
    </parameter>
</transportReceiver>

All my proxy services listening on jms queues use this configuration. The esb doesn't consume any messages. When I remove the "&nested.consumer.exclusive=true" it correctly consumes messages. If I look at the activemq console, I see 0 consumers on my queues (normally, 1) If I delete the queues and restart the esb, the queues are not recreated (normally they are)

1
The goal is to have 2 esbs in a failover configuration, but that the processing of the messages happens on only one esb, while the others just waits until there is a problem. Is there another way to achieve this ? - jonenst

1 Answers

0
votes

The option needs to be set on the proxy service:

<proxy name="Myqueue?consumer.exclusive=true&amp;consumer.prefetchSize=0" startOnLoad="true" transports="jms" xmlns="http://ws.apache.org/ns/synapse">

However this creates errors in the log:

2018-07-31 18:50:02,981  WARN JMSListener - Error registering a MBean with objectname ' org.apache.axis2:Type=Transport,ConnectorName=jms-listener-1065586266,Group=Services,Service=JMS_SMS_MainNotification?consumer.exclusive=true&consumer.prefetchSize=0 ' for JMX management

javax.management.MalformedObjectNameException: Invalid character '=' in value part of property at javax.management.ObjectName.construct(ObjectName.java:618)

But as far as I understand the alternative is to use transport.jms.Destination (cf https://docs.wso2.com/display/ESB490/JMS+Transport ) but this duplicates the axis2.xml configuration ?? Is that it ?