Deploy more instances of the same MDB - ibm-mq

We have an application that writes messages to a Queue (not a topic). Another application (a cluster with two nodes) reads the messages from the queue via Message Driven Beans. All applications are deployed on Glassfish 4 servers.
We are currently undergoing a big migration and we are writing to the queue faster than we can process. We are using IBM WebSphere MQ .
My question is - can we deploy more instances of the same MDB? Or how can make the processing of the messages faster?
Thank you!

How many active MDB instances do you have? If the answer is 10, youneed to increase the maxPoolDepth (defaults to 10) in your MDBs activation specification.

Related

Even Load Distribution of JMS Queue listeners not happening

I have 2 instances of my application (2 different machines) configured to listen on a single IBM MQ queue, each of them configured with 4 concurrent consumers in the cxf bean.
<bean id="TestConfig0" class="org.apache.cxf.transport.jms.JMSConfiguration"
p:sessionTransacted="false" p:connectionFactory-ref="jmsConnectionFactory0" p:concurrentConsumers="4"
p:targetDestination="TestQueue" p:deliveryMode="1"/>
When I run my application to read the data from the above queue. I see that 70% of the messages are picked up by server1 and only 30% by server2.
All the configurations are equal among both the app instances with respect to the JMS configuration.
Its bit strange to observe this pattern.
How do i ensure that both my app instance pick the messages from the Queues evenly ??
There is an answer to a similar question:
MQ's default behaviour is to give messages to the MOST RECENT getter.

IBM Liberty message consumption with fail-over

We are designing a solution that will consume messages from IBM MQ using JMS. The plan is to use WAS Liberty, so JMS is the technology of choice. We will create Message-Drive beans that will listen for messages in MQ queues.
We are considering both WAS Liberty and OpenLiberty as well.
The trick here is that we must implement it with fail-over, so that if one of our server fail, the other will keep consuming messages from MQ automatically. Like in a ative/passive mechanism.
I'm aware that the MQ adapter needs to be installed as it is not provided out-of-the-box.
I have the following questions:
Does WAS Liberty messaging implementation supports fail-over? Meaning that if the ative message consumer node fails, the stand-by node will automatically migrate and start consuming messages from MQ? What about OpenLiberty?
How can I configure the message system to work that way? Can you point out to the documentation?
Or is this feature only provided by WebSphere?
There is no such functionality in WebSphere Liberty or Open Liberty yet. You can create RFE here https://www.ibm.com/developerworks/rfe/?PROD_ID=544 .
There are ways to do it manually, check these links:
JMS Activation spec on Liberty: “WAS_EndpointInitialState” full profile equivalent property?
Controlling the state of endpoints at runtime
Solution that you could do:
create a script/application that will monitor your servers and call that API to enable/disable endpoint in specific server
or use Dynamic cluster/ auto scaling feature of Liberty and divide you app to two clusters - one with MDBs, one without. And then define policy that MDBs cluster has 1 instance always available. So once the server dies it is automatically restarted somewhere in the cluster
or use Kubernetes/ICP platform in the same way - so deploying 2 versions of app, and defining different replicasets parameters.

How does a Topic Message Driven Bean behave in Websphere 8.5.5 Cluster Environment

What I would like is to run a Message Driven Bean that listens onto a (Websphere MQ7) topic. I would like to deploy my application on a Websphere 8.5.5 Cluster containing two cluster members.
If a message for the topic arrives I would expect that only one of my two MDBs gets the message and process it.
IBM states that I should set identically ClientIds and Subscription Names to ensure that only one instance is able to process a message on a Topic:
http://www-01.ibm.com/support/docview.wss?uid=swg21442559
Will the second MDB receive the mentioned MQRC_SUBSCRIPTION_IN_USE Exception, or will the cluster take care that one and only one MDB in the cluster will consume the topic-message?
Maybe someone can point me to the IBM Documentation where this behaviour is defined.
To allow multiple concurrent instances of an MDB to access the same subscription on an MQ queue manager you can enable "Allow cloned durable subscriptions" in the activation spec for the MDB.
https://www-01.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.nd.doc/ae/umj_pasm.html
Running like this means both instances of the MDB will start (no IN_USE errors) and each message for that single subscription will be processed by one instance of the MDB. You would use this to workload balance messages across the multiple WAS servers.
This is only true for durable subscriptions. And only when the MDB instances are connected to the same queue manager.

Sending a JMS message to a remote queue on JBoss AS 5 and AS 7

I have two servers
JBoss as 5.1 with an application sending JMS messages
JBoss AS 7 server with the queue implemented and an MDB consuming messages
I would like to send a message from server one to server two. I would like the message to be consumed on server two.
I think JBoss AS 7 uses HornetQ.
Any hints on how to send a message to a remote queue? I'm more interested on how to send messages because it is on the remote server, and I think the consuming part should be straight forward.
You are correct that JBoss AS 7 uses HornetQ for messaging as the JMS provider. A great resource is the JBoss community documentation for HornetQ. There is also an excellent post on the JBoss community forums about setting up HornetQ across two instances of AS 7.
You will need to define your connectors and acceptors that make up the transports, which in your case will include netty as your client and server are running in different JVMs (otherwise you could use invm). Creating your connection factories will differ on each JBoss AS instance (for example, there is no Management CLI on JBoss AS 5), but the above link will give you a good reference, and you can ask targeted questions in there.

How to create physical queue in JMS at run time

Want to know how to create physical queue in JMS at run time.
when I search for this I got Creating JMS Queues at runtime
But when I read http://activemq.apache.org/how-do-i-create-new-destinations.html I come to know queue which mention in Creating JMS Queues at runtime is not creating any physical queue at server side.
Please correct me if I m wrong. If any one know to create physical queue at run time please replay.
Thanks in advance.
The creation of "normal" queues is not adressed by the JMS standard. Depending on what you want to do there are two approaches:
use temporary queues -> however they have many restrictions, most commonly they are used forrequest-reply scenarios
use the API of the JMS provider - however your solution will be depending on this specific provider then
The JMS standard only addresses sending and receiving data from objects like queues and topics. Creation of JMS artefacts is vendor specific and most often requires using:
1)specific vendor APIs (not JMS)
2)command/admin messages aimed at the JMS server (command agents on activemq)
3)JMX API
I have used JMX method, which is the most powerful, but also the most work.
JMX Method for activemq (version 5.0+)
a) JMS Server Setup
1) Enable JMX in activemq startup scripts and activemq.xml files
2) If you are authenticating to to the server, make sure your user has admin privileges setup in activemq.xml (see http://activemq.apache.org/security.html)
3)restart activemq server
b) Your Client Code
1) create an instance of org.apache.activemq.broker.jmx.BrokerViewMBean (you will need to connect with some JMX connectivity code which is a bit messy)
2) use its addQueue method. This will create a queue on the server
(The process is similar for hornetq but since you mentioned Activemq I have omitted hornetq details here.)
I have used this method myself and it works.
An alternative is to use Command Agents in Activemq, but I have no personal experience with these. These are special messages contain admin commands and may do what you want as well.

Resources