package com.nvarghese.beowulf.common.jms;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* Jms Queue Manager to manage a single queue which consists of one producer
* instance and multiple consumer instances
*
* @author nibin
*
*/
public class JmsQueueManager {
private InitialContext ic;
private String queueName;
private String connectionFactoryName;
private JmsQueueSender queueSender;
private List<JmsQueueReceiver> queueReceivers;
private AtomicBoolean initialized = new AtomicBoolean(false);
static Logger logger = LoggerFactory.getLogger(JmsQueueManager.class);
public static final String MESSAGE_OPERATION = "messageOperation";
public static final String MESSAGE_PAYLOAD = "messagePayload";
public JmsQueueManager(String queueName, String connectionFactoryName) {
this.queueName = queueName;
this.connectionFactoryName = connectionFactoryName;
queueReceivers = new ArrayList<JmsQueueReceiver>();
}
public void initializeQueueSenderOnly(InputStream jndiFileInputStream) throws JMSException, IOException, NamingException {
if (initialized.get() == false) {
ic = getContext(jndiFileInputStream);
Queue queue = (Queue) ic.lookup(queueName);
// connection factory lookup is hard coded at this moment
ConnectionFactory cf = (ConnectionFactory) ic.lookup(connectionFactoryName);
queueSender = new JmsQueueSender(queue);
queueSender.initialize(cf);
initialized.set(true);
}
}
public void initializeQueueReceiverOnly(InputStream jndiFileInputStream, int countOfReceivers, MessageListener jmsMessageListener)
throws JMSException, IOException, NamingException {
if (initialized.get() == false) {
ic = getContext(jndiFileInputStream);
Queue queue = (Queue) ic.lookup(queueName);
// connection factory lookup is hard coded at this moment
ConnectionFactory cf = (ConnectionFactory) ic.lookup(connectionFactoryName);
queueSender = null;
for (int i = 0; i < countOfReceivers; i++) {
JmsQueueReceiver receiver = new JmsQueueReceiver(queue);
receiver.initialize(cf, jmsMessageListener);
queueReceivers.add(receiver);
}
initialized.set(true);
}
}
public void initializeAll(InputStream jndiFileInputStream, int countOfReceivers, MessageListener jmsMessageListener) throws JMSException,
IOException, NamingException {
if (initialized.get() == false) {
ic = getContext(jndiFileInputStream);
Queue queue = (Queue) ic.lookup(queueName);
// connection factory lookup is hard coded at this moment
ConnectionFactory cf = (ConnectionFactory) ic.lookup(connectionFactoryName);
queueSender = new JmsQueueSender(queue);
queueSender.initialize(cf);
for (int i = 0; i < countOfReceivers; i++) {
JmsQueueReceiver receiver = new JmsQueueReceiver(queue);
receiver.initialize(cf, jmsMessageListener);
queueReceivers.add(receiver);
}
initialized.set(true);
}
}
public void initializeAll(InputStream jndiFileInputStream, int countOfReceivers, MessageListener jmsMessageListener, String userName,
String password) throws JMSException, IOException, NamingException {
if (initialized.get() == false) {
ic = getContext(jndiFileInputStream);
Queue queue = (Queue) ic.lookup(queueName);
// connection factory lookup is hard coded at this moment
ConnectionFactory cf = (ConnectionFactory) ic.lookup(connectionFactoryName);
queueSender = new JmsQueueSender(queue);
queueSender.initialize(cf, userName, password);
for (int i = 0; i < countOfReceivers; i++) {
JmsQueueReceiver receiver = new JmsQueueReceiver(queue);
receiver.initialize(cf, jmsMessageListener, userName, password);
queueReceivers.add(receiver);
}
initialized.set(true);
}
}
public void sendTextMapMessage(String operation, String message) throws JMSException {
Message mapMessage = this.getJmsQueueSender().getSession().createMapMessage();
mapMessage.setStringProperty(MESSAGE_OPERATION, operation);
mapMessage.setStringProperty(MESSAGE_PAYLOAD, message);
this.getJmsQueueSender().getProducer().send(mapMessage);
}
public JmsQueueSender getJmsQueueSender() {
return queueSender;
}
public void startJmsQueueSender() throws JMSException {
queueSender.startConnection();
}
public void startJmsQueueReceivers() throws JMSException {
for (JmsQueueReceiver r : queueReceivers) {
r.startConnection();
}
}
public void shutDownAll() throws JMSException, NamingException {
ic.close();
if (queueSender != null)
queueSender.shutdownAll();
for (JmsQueueReceiver r : queueReceivers) {
r.shutdownAll();
}
}
private InitialContext getContext(InputStream jndiFileInputStream) throws IOException, NamingException {
Properties props = new Properties();
try {
props.load(jndiFileInputStream);
} finally {
if (jndiFileInputStream != null) {
jndiFileInputStream.close();
}
}
return new InitialContext(props);
}
}