Show List

Transactions in JMS

A transaction in JMS is a mechanism that ensures that a series of related message operations are either all committed or all rolled back. This ensures that the state of the system remains consistent in case of a failure during the processing of messages.

Here are a few examples of how transactions can be used in JMS:

  1. A bank wants to transfer funds from one account to another. The transfer is initiated by sending two JMS messages: one to debit the account and another to credit the account. To ensure that either both operations are executed or neither is executed, the bank can use a JMS transaction. In case of a system failure during the processing of the messages, the JMS provider will roll back the transaction, ensuring that the accounts remain in their original state.

  2. A retail company wants to process a series of messages that update its inventory and billing systems. To ensure that either all updates are executed or none are executed, the company can use a JMS transaction. In case of a system failure during the processing of the messages, the JMS provider will roll back the transaction, ensuring that the systems remain in their original state.

In both examples, using transactions helps ensure the consistency of the system in case of failures, providing a reliable and robust mechanism for processing JMS messages.


Implementing transactions in JMS involves the following steps:

  1. Obtain a JMS Connection Factory and create a JMS Connection:
ConnectionFactory factory = ...;
Connection connection = factory.createConnection();
  1. Start a JMS transaction by setting the Session.SESSION_TRANSACTED flag to true when creating the JMS Session:
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
  1. Create a JMS Message Producer and send messages within the transaction:
MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage("Hello World");
producer.send(message);
  1. Commit the transaction after all messages have been sent:
session.commit();
  1. Close the JMS Connection and Session after the transaction has been committed:
producer.close();
session.close();
connection.close();

If an exception is thrown during the processing of the messages, the transaction can be rolled back using the session.rollback() method. This will undo any changes made to the system during the transaction.

Here is the complete code example:

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

ConnectionFactory factory = ...;
Connection connection = factory.createConnection();
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
Destination destination = ...;
MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage("Hello World");
producer.send(message);
session.commit();
producer.close();
session.close();
connection.close();
In this example, a JMS Connection and Session are created, a message is sent within a transaction, and the transaction is committed. The transaction ensures that the message is either sent or not sent, providing a reliable mechanism for processing JMS messages.

    Leave a Comment


  • captcha text