Ever looked for a simple JMS Consumer template – here is one and it is transacted too 🙂
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.naming.InitialContext;
public class Consumer {
public static void main(String[] args) throws Exception {
InitialContext context = new InitialContext();
ConnectionFactory factory =
(ConnectionFactory) context.lookup("ConnectionFactory");
Connection connection = factory.createConnection();
connection.start();
// Start the transaction
Session session =
connection.createSession(true, Session.SESSION_TRANSACTED);
Destination destination = (Destination) context.lookup("test");
MessageConsumer consumer = session.createConsumer(destination);
Message message;
try {
// Get all messages of the queue
while ((message = consumer.receive(3000)) != null) {
System.out.println("Message: " + message);
}
// All is well - commit transaction
session.commit();
} catch (Exception e) {
e.printStackTrace();
// Something is wrong - rollback transaction
session.rollback();
}
// Cleanup
session.close();
connection.close();
context.close();
}
}
This solution depends on JNDI so here is the jndi.properties also:
java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
# Use the following property to configure the default connector
java.naming.provider.url = tcp://localhost:61616
# Register some queues in JNDI using the form
# queue.[jndiName] = [physicalName]
queue.test = NIKLAS.TEST
I’m using an ActiveMQ server as JMS provider which works good with the ActiveMQ client:
pom.xml
org.apache.activemq
activemq-client
5.7.0
Tested on Windows 10, Maven 3.8.4, Java 11.0.18 and ActiveMQ Client 5.7.0