package study.ejb2.lifecycle.messagedriven;
import java.io.Serializable;
import javax.jms.JMSException;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
/**
* Using the JMS.
*
* Connection factories are administered objects that allow an application to
* connect to a provider by creating a Connection object programmatically.
*
* A Session provides a transactional context in which a set of messages to be
* sent or received is grouped in an atomic unit of work, meaning that if you
* send several messages during the same session, JMS will ensure that they
* either all arrive in the order they’ve been sent at the destination or none
* at all.
*
* We can use some headers from message to specify the priority and so on.
*/
public class QueueMessageSender {
// Connection to JMS
private QueueConnection queueConnection;
// Session to JMS
private QueueSession queueSession;
// queue to our JMS linked to MBD
private Queue queue;
// sender to our JMS linked to MDB
private QueueSender queueSender;
public QueueMessageSender(String jndiFactory, String jndiQueue)
throws NamingException, JMSException {
// gets the JNDI
Context context = new InitialContext();
// gets a ConnectionFactory
QueueConnectionFactory queueFactory = (QueueConnectionFactory) context
.lookup(jndiFactory);
// create a JMS connection from the ConnectionFactory
queueConnection = queueFactory.createQueueConnection();
// creates the session with JMS, the first param specifies whether or not the session is transactional
// if true the messages only will be send after a commit()
queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
// gets the JMS destination
queue = (Queue) context.lookup(jndiQueue);
// gets the sender to JMS destination
queueSender = queueSession.createSender(queue);
}
public void sendText(String text) throws JMSException {
TextMessage message = queueSession.createTextMessage();
message.setText(text);
queueSender.send(message);
}
public void sendObject(Serializable object) throws JMSException {
ObjectMessage message = queueSession.createObjectMessage();
message.setObject(object);
queueSender.send(message);
}
public void close() {
try {
queueSender.close();
} catch (JMSException e) {
}
try {
queueSession.close();
} catch (JMSException e) {
}
try {
queueConnection.close();
} catch (JMSException e) {
}
}
}