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