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.
-
Install RabbitMQ along with erlang
-
After the installation go to sbin folder of the installation
for example: C:\Program Files\RabbitMQ Server\rabbitmq_server-3.9.10\sbin>
-
Use command rabbitmqctl.bat status to know the details of the PID, listener port, plugins installed etc…
-
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
-
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 )
-
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
-
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
- From “Create a resource” option, create a namespace for “Service BUS”
- Create a queue from Entities → Queues
- 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