package org.javaee7.jms.batch;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.jms.ConnectionFactory;
import javax.jms.JMSConsumer;
import javax.jms.JMSContext;
import javax.jms.Topic;
/**
* Create durable subscription upon deployment.
*
* Durable subscription needs unique subscription name and client id. Since setting
* client id is not possible in Java EE environment, we define app-specific connection
* factory with a client id.
*
* @author Patrik Dudits
*/
@Singleton
@Startup
public class SubscriptionCreator {
@Resource(lookup = Resources.TOPIC)
Topic topic;
@Resource(lookup = Resources.CONNECTION_FACTORY)
ConnectionFactory factory;
/**
* We create the subscription at soonest possible time after deployment so we
* wouldn't miss any message
*/
@PostConstruct
void createSubscription() {
try (JMSContext jms = factory.createContext()) { // <1> This is factory with clientId specified
JMSConsumer consumer = jms.createDurableConsumer(topic, Resources.SUBSCRIPTION); // <2> creates durable subscription on the topic
consumer.close();
}
}
}