This site contains the documentation that is relevant to older WSO2 product versions and offerings.
For the latest WSO2 documentation, visit https://wso2.com/documentation/.
Tuning the JMS Transport
The Java Message Service (JMS) transport of the WSO2 Enterprise Integrator (WSO2 EI) allows you to easily send and receive messages to queues and topics of any JMS service that implements the JMS specification. The following sections describe how you can tune the JMS transport of WSO2 EI for better performance.
Increase the maximum number of JMS proxies
If you create several JMS proxy services in WSO2 EI, you will see a message similar to the following:
WARN - JMSListener Polling tasks on destination : JMStoHTTPStockQuoteProxy18 of type queue for service JMStoHTTPStockQuoteProxy18 have not yet started after 3 seconds ..
This issue occurs when you do not have enough threads available to consume messages from JMS queues. The maximum number of concurrent consumers (that is, the number of JMS proxies) that can be deployed is limited by the base transport worker pool that is used by the JMS transport. You can configure the size of this worker pool using the system properties lst_t_core
 and lst_t_max
. Note that increasing these values will also increase the memory consumption, because the worker pool will allocate more resources.
Similarly, you can configure the current number and the anticipated number of outbound JMS proxies using the system properties snd_t_core
 and snd_t_max
.
To adjust the values of these properties, you can modify the server startup script if you want to increase the available threads for NHTTP and JMS transports (requires more memory), or create a jms.properties
 file if you want to increase the available threads just for the JMS transport. Both approaches are described below.
To increase the threads for NHTTP and JMS transports
- Open the integrator.sh or integrator.bat file in yourÂ
<EI_HOME>/bin
 directory for editing. Change the values of the properties as follows:Â
If you do not have the following properties in the
integrator.sh
orintegrator.bat
files, add them with the given values.-Dlst_t_core=200
The defined values is applied as a System Property.
-Dlst_t_max=250
-Dsnd_t_core=200
-Dsnd_t_max=250
To increase the threads for just the JMS transport
- Create a file namedÂ
jms.properties
 insideÂ<EI_HOME>/conf
with the following properties:lst_t_core=200
lst_t_max=250
snd_t_core=200
snd_t_max=250
Determine a suitable value for lst_t_core and snd_t_core
Make sure that the above mentioned recommended values per server satisfy the following calculation.
lst_t_core >  Total number of consumers + 20 lst_t_core < lst_t_max snd_t_core > Total number of consumers + 20 snd_t_core < snd_t_max
- Total number of consumers =Â transport.jms.MaxConcurrentConsumers * Number of JMS proxies
- 20 threads have been added as a buffer.
- Default value for
lst_t_core
andsnd_t_core
is 20. - If you do not specify a value for
lst_t_core
andsnd_t_core
, the default values are applied.
If the above values that you derived exceed the recommended values, make sure that your server has the necessary resources to handle the defined thread pool size efficiently.
Configuring JMS Listener
You can increase the JMS listener performance by
Using concurrent consumers
Concurrent consumers is the minimum number of threads for message consuming. If there are more messages to be consumed while the running threads are busy, then additional threads are started until the total number of threads reaches the value of the maximum number of concurrent consumers (ie., MaxConcurrentConsumers
). The maximum number of concurrent consumers (or the number of JMS proxies) that can be deployed is limited by the base transport worker pool that is used by the JMS transport. The size of this worker pool can be configured via the system property 'lst_t_core' and 'lst_t_max' as described above. The number of concurrent producers are generally limited by the Synapse core worker pool.
Note
Concurrent consumers are only applicable to JMS queues not for JMS topics.
To increase the JMS listener performance
Add the following parameters to the JMS listener configuration of the <EI_HOME>/conf/axis2/axis2.xml
file:
<parameter name="transport.jms.ConcurrentConsumers" locked="false">50</parameter> <parameter name="transport.jms.MaxConcurrentConsumers" locked="false">50</parameter>
Parameters
transport.jms.ConcurrentConsumers
: the concurrent threads that need to be started to consume messages when polling.transport.jms.MaxConcurrentConsumers
: the maximum number of concurrent threads to use during polling.
If you set t he locked
property to true
, the JMS proxy creates only one listener thread at a given time. If you set it to false
, then it creates multiple listener threads from a single proxy to consume messages concurrently.
Enable caching
Add the following parameter to the JMS listener configuration of the <EI_HOME>/conf/axis2/axis2.xml
 file to enable caching:
<parameter name="transport.jms.CacheLevel">consumer</parameter>
The possible values for the cache level are none
, auto
, connection
, session
and consumer
. Out of the possible values, consumer
is the highest level that provides maximum performance.
After adding concurrency consumers and cache level, your complete configuration would be as follows:
<transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener"> .... <parameter name="myQueueConnectionFactory" locked="false"> <parameter name="java.naming.factory.initial" locked="false">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter> <parameter name="java.naming.provider.url" locked="false">tcp://localhost:61616</parameter> <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter> <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter> <parameter name="transport.jms.ConcurrentConsumers" locked="false">50</parameter> <parameter name="transport.jms.MaxConcurrentConsumers" locked="false">50</parameter> <parameter name="transport.jms.CacheLevel">consumer</parameter> </parameter> …. </transportReceiver>
Configuring JMS Sender
Enabling caching
Add the following parameter to the JMS sender configuration of the <EI_HOME>/conf/axis2/axis2.xml
 file:
<parameter name="transport.jms.CacheLevel">producer</parameter>
The possible values for the cache level are none
, auto
, connection
,session
 and producer
. Out of the possible values, producer
 is the highest level that provides maximum performance.
When using producer
as the cache level, ensure to add the JMS destination parameter to avoid the following error:
INFO - AxisEngine [MessageContext: logID=2eabe85aeeb3bb62c26bb46d21b11b087ebf1e5e0b350839] JMSCC0029: A destination must be specified when sending fromÂ
this
 producer.
Remove ClientApiNonBlocking
when sending messages via JMS
By default, Axis2 spawns a new thread to handle each outgoing message. To change this behavior, you need to remove the ClientApiNonBlocking
 property from the message.
Note
Removal of this property can be vital when queuing transports like JMS are involved.
To remove the ClientApiNonBlocking
 property
Add the following parameter to the configuration:
<property name="ClientApiNonBlocking" action="remove" scope="axis2"/>