标准 JMS API 步骤:
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 环境中,您应该使用消息驱动的 bean。您可以在 http://java.sun.com/javaee/6/docs/tutorial/doc/gipko.html 上找到有关它们的 ino 以及在 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();
}
}
}