package org.javaee7.jms.batch; import javax.annotation.Resource; import javax.batch.api.chunk.AbstractItemReader; import javax.inject.Named; import javax.jms.ConnectionFactory; import javax.jms.JMSConsumer; import javax.jms.JMSContext; import javax.jms.Topic; import java.io.Serializable; /** * @author Patrik Dudits */ @Named public class JmsItemReader extends AbstractItemReader { @Resource(lookup = Resources.CONNECTION_FACTORY) ConnectionFactory factory; private JMSContext jms; @Resource(lookup = Resources.TOPIC) Topic topic; private JMSConsumer subscription; @Override public void open(Serializable checkpoint) throws Exception { jms = factory.createContext(); // <1> Since we're not using default connection factory, we use app managed +JMSContext+ subscription = jms.createDurableConsumer(topic, Resources.SUBSCRIPTION); } @Override public Object readItem() throws Exception { Integer item = subscription.receiveBodyNoWait(Integer.class); // <2> When there is no message ready to be received, +null+ is returned, fulfilling +readItem+ contract return item; } @Override public void close() throws Exception { subscription.close(); // <3> Free resources at end of run jms.close(); } }