Стандартные шаги API JMS:
1. Создайте javax.naming.Context с деталями доступа к серверу
context = new InitialContext(environment)
2. Посмотрите javax.jms.QueueConnectionFactory в контексте. Название фабрики относится к JMS-серверу
factory = (QueueConnectionFactory)context.lookup(factoryName)
3. Создайте javax.jms.QueueConnection
connection = factory.createQueueConnection(...)
4. Создайте javax.jms.QueueSession
session = connection.createQueueSession(...)
5. Найдите свой javax.jms.Queue в контексте
queue = (Queue) context.lookup(qJndiName)
До сих пор это то же самое, что отправка ....
6. Создайте javax.jms.QueueReceiver с сеансом
receiver = session.createReceiver(queue)
7. JMS API предоставляет 2 способа получения сообщения:
7.a Ждать сообщения одним из методов receiver.receive()
7.b Реализуйте javax.jms.MessageListener в своем классе и зарегистрируйте его в качестве слушателя
receiver.setMessageListener(this)
JMS API будет вызывать ваш метод onMessage()
всякий раз, когда приходит новое сообщение
8. Не забудьте запустить слушатель:
connection.start()
9. Закройте контекст (очень важно при доступе к нескольким JMS-серверам из одной и той же программы):
context.close()
Выше приведено типичное решение из автономного приложения. В среде EJB вы должны использовать бины, управляемые сообщениями. Вы можете найти ino на них на http://java.sun.com/javaee/6/docs/tutorial/doc/gipko.html и учебник на http://schuchert.wikispaces.com/EJB3+Tutorial+5+-+Message+Driven+Beans
Вот рабочий пример, который вы просили:
import java.util.Hashtable;
import javax.naming.*;
import javax.jms.*;
public class JMSJNDISample implements MessageListener {
public static final String JNDI_URL = "jnp://localhost:1099";
public static final String JNDI_CONTEXT_FACTORY = "org.jnp.interfaces.NamingContextFactory";
public static final String JMS_USER = null;
public static final String JMS_PASSWORD = null;
public static final String JMS_CONNECTION_FACTORY = "MyConnectionFactory";
public static final String QUEUE_JNDI_NAME = "ReceiverQueue";
QueueConnection qConn = null;
QueueSession qSession = null;
QueueSender qSender = null;
QueueReceiver qReceiver = null;
public JMSJNDISample () {
}
public void init() throws JMSException, NamingException {
// Set up JNDI Context
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_CONTEXT_FACTORY);
env.put(Context.PROVIDER_URL, JNDI_URL);
if (JMS_USER != null)
env.put(Context.SECURITY_PRINCIPAL, JMS_USER);
if (JMS_PASSWORD != null)
env.put(Context.SECURITY_CREDENTIALS, JMS_PASSWORD);
Context jndiContext = new InitialContext(env);
// Lookup queue connection factory
QueueConnectionFactory cFactory = (QueueConnectionFactory)jndiContext.lookup(JMS_CONNECTION_FACTORY);
// Create Connection
if (JMS_USER == null || JMS_PASSWORD == null)
qConn = cFactory.createQueueConnection();
else {
qConn = cFactory.createQueueConnection(JMS_USER, JMS_PASSWORD);
}
// Create Session
qSession = qConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
// Lookup Queue
Queue queue = (Queue) jndiContext.lookup(QUEUE_JNDI_NAME);
// Create Queue Sender
qSender = qSession.createSender(queue);
// Create Queue Receiver
qReceiver = qSession.createReceiver(queue);
qReceiver.setMessageListener(this);
// Start receiving messages
qConn.start();
// Close JNDI context
jndiContext.close();
}
public void sendMessage (String str) throws JMSException {
TextMessage msg = qSession.createTextMessage(str);
qSender.send(msg);
}
public void onMessage (Message message) {
try {
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage)message;
System.out.println("Text Message Received: "+textMessage.getText());
} else {
System.out.println(message.getJMSType()+" Message Received");
}
} catch (JMSException je) {
je.printStackTrace();
}
}
public void destroy() throws JMSException {
if (qSender != null) qSender.close();
if (qReceiver != null) qReceiver.close();
if (qSession != null) qSession.close();
if (qConn != null) qConn.close();
}
public static void main(String args[]) {
try {
JMSJNDISample sample = new JMSJNDISample();
// Initialize connetion
sample.init();
// Send Message
sample.sendMessage("Hello World");
// Wait 2 sec for answer
Thread.sleep(2000);
// Disconnect
sample.destroy();
} catch (Exception e) {
e.printStackTrace();
}
}
}