Integration Server support for AMQP with providers (Azure Service Bus and RabbitMQ)

Overview

webMethods Integration Server supports JMS over AMQP by using Apache QPID client libraries. We can connect with 0.x and 1.0 protocol with the limitations of unsupported features (based on providers)

  * MessageSelectors are not supported.
  * Temporary destinations are not supported.
  * Transacted/distributed transactions are not supported.
  * Volatile topic subscriptions not supported
  * One to many session -> consumer not supported

and there might be many based on the provider.

Warning: While creating a JMS connection alias in Integration Server, consider unchecking the “Create Temporary Queue” option as JMS over AMQP doesn’t support temporary destinations. Without this the connection might get into a hung state and will always show as “In Progress”.

Recommendations: Frequent polling sometimes introduces issues with Azure Service Bus sessions, and those bad sessions will have a side effect on both client and server as the consumers will continuously trying to reconnect, so consider increasing the primary and secondary thread polling intervals in Integration Server.

Tune the following AMQP properties correctly as per the need
jms.prefetchPolicy
amqp.idleTimeout

Having a short idle timeout will have frequent connection refresh, so I would recommend to change the default idle timeout.

The documentation says it officially supports 0.x protocol version and uses the 0.x version JNDI content factory class as a default value for the JNDI template for QPID AMQP 0.x, whereas the upcoming release will also add the support for 1.0 protocol

JNDI configurations for AMQP 0.x protocol

Initial Context Factory → org.apache.qpid.jndi.PropertiesFileInitialContextFactory

JNDI configurations for AMQP 1.0 protocol

Initial Context Factory → org.apache.qpid.jms.jndi.JmsInitialContextFactory

Sample JNDI properties file (0.x)

#connectionfactory.[jndiname] = [ConnectionURL]
connectionfactory.myCF = amqp://[username]:[password]@/?maxprefetch='1000'&brokerlist='tcp://host:port'

#destination.[jndiname] = [address_string]
#for Queue
queue.testQueue1=testQueue1
#for Topic
topic.testTopic1=testTopic1

Sample JNDI properties file (1.0)

#connectionfactory.[jndiname] = [ConnectionURL]
connectionfactory.cf=amqp(s)://[serverurl]?jms.username=[username]&jms.password=[password]&amqp.idleTimeout=[timeout]&jms.prefetchPolicy.all=0&amqp.traceFrames=true&jms.clientID=[client_ID]
#destination.[jndiname] = [address_string]
#for Queue
queue.q1 = q1
#for Topic
topic.t1 = t1

RabbitMQ Setup

RabbitMQ supports AMQP 1.0 via a plugin.

  1. Install RabbitMQ along with erlang

  2. After the installation go to sbin folder of the installation

    for example: C:\Program Files\RabbitMQ Server\rabbitmq_server-3.9.10\sbin>

  3. Use command rabbitmqctl.bat status to know the details of the PID, listener port, plugins installed etc…

  4. As the web interface of RabbitMQ is disabled by default, to enable it we need to install the following plugin (rabbitmq_management)

    C:\Program Files\RabbitMQ Server\rabbitmq_server-3.9.10\sbin>rabbitmq-plugins.bat enable rabbitmq_management

  5. Now you can again run the rabbitmqctl.bat status command and check the actual http port for the admin UI Interface: [::], port: 15672, protocol: http, purpose: HTTP API

    Use the host:port http://localhost:15672/ to open the Admin UI with the default username/password as ( guest/guest )

  6. As we are interested in JMS, Enabling the Topic Selector Plug-in is also required

    C:\Program Files\RabbitMQ Server\rabbitmq_server-3.9.10\sbin>rabbitmq-plugins enable rabbitmq_jms_topic_exchange

  7. As AMQP 1.0 is supported through a plugin in RabbitMQ, let’s enable that as well

    C:\Program Files\RabbitMQ Server\rabbitmq_server-3.9.10\sbin>rabbitmq-plugins enable rabbitmq_amqp1_0

Azure Service Bus Setup

Assuming that you have access to Azure landing zone, here is what next for getting started

  1. From “Create a resource” option, create a namespace for “Service BUS”
  2. Create a queue from Entities → Queues
  3. Click on “Shared access policies” and from Primary Connection String, we have to build the ConnectionURL to be used for connectionfactory
    amqps://[namespace].servicebus.windows.net?jms.username=[username]&jms.password=[url encoded password]
    (or)
    amqps://[username]:[password]@[namespace].servicebus.windows.net

You must URL-encode the password manually

Integration Server JNDI/JMS setup

Download the respective QPID JMS client libraries based on the AMQP version and put the jars into Integration Server lib\jars directory

Demo

ISJMSOVERAMQP

2 Likes