前言
写了一个简单的JMS例子,之所以使用JNDI 是出于通用性考虑,该例子使用JMS规范提供的通用接口,没有使用具体JMS提供者的接口,这样可以保证我们编写的程序适用于任何一种JMS实现(ActiveMQ、HornetQ...)。
什么是JNDI
JNDI(Java Naming and Directory Interface)是一个标准规范,类似于JDBC,JMS等规范,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口。J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现,因此Tomcat就实现了JNDI 规范。
使用Tomcat配置JNDI
找到Tomcat安装路径下的conf文件夹,打开context.xml,添加如下配置:
启动ActiveMQ
CMD到ActiveMQ安装路径下的bin目录,输入“activemq start”指令即可启动,可在浏览器中输入地址http://localhost:8161/admin,查看队列、话题等信息。
编写一个Web工程
eclipse上新建web工程,添加ActiveMQ依赖的jar包,然后开始编写两个Servlet,一个用于生产消息,另一个用于消费消息,如下代码:
消息生产者Servlet:
importjava.io.IOException;importjava.io.PrintWriter;importjavax.jms.DeliveryMode;importjavax.jms.Queue;importjavax.jms.QueueConnection;importjavax.jms.QueueConnectionFactory;importjavax.jms.QueueSender;importjavax.jms.QueueSession;importjavax.jms.Session;importjavax.jms.TextMessage;importjavax.naming.InitialContext;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/*** Servlet implementation class JMSTest*/@WebServlet("/Send")public class Send extendsHttpServlet {private static final long serialVersionUID = 1L;/***@seeHttpServlet#HttpServlet()*/
publicSend() {super();//TODO Auto-generated constructor stub
}/***@seeHttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)*/
protected voiddoGet(HttpServletRequest request,
HttpServletResponse response)throwsServletException, IOException {
PrintWriter out=response.getWriter();try{//get the initial context
InitialContext context = newInitialContext();//lookup the queue object
Queue queue = (Queue) context.lookup("java:comp/env/queue/queue0");//lookup the queue connection factory
QueueConnectionFactory conFactory =(QueueConnectionFactory) context
.lookup("java:comp/env/queue/connectionFactory");//create a queue connection
QueueConnection queConn =conFactory.createQueueConnection();//create a queue session
QueueSession queSession = queConn.createQueueSession(false,
Session.DUPS_OK_ACKNOWLEDGE);//create a queue sender
QueueSender queSender =queSession.createSender(queue);
queSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//create a simple message to say "Hello World"
TextMessage message = queSession.createTextMessage("Hello World");//send the message
queSender.send(message);//print what we did
out.write("Message Sent: " +message.getText());//close the queue connection
queConn.close();
}catch(Exception e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}/***@seeHttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)*/
protected voiddoPost(HttpServletRequest request,
HttpServletResponse response)throwsServletException, IOException {//TODO Auto-generated method stub
}
}
消息消费者Servlet:
importjava.io.IOException;importjava.io.PrintWriter;importjavax.jms.Queue;importjavax.jms.QueueConnection;importjavax.jms.QueueConnectionFactory;importjavax.jms.QueueReceiver;importjavax.jms.QueueSession;importjavax.jms.Session;importjavax.jms.TextMessage;importjavax.naming.InitialContext;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/*** Servlet implementation class Receive*/@WebServlet("/Receive")public class Receive extendsHttpServlet {private static final long serialVersionUID = 1L;/***@seeHttpServlet#HttpServlet()*/
publicReceive() {super();//TODO Auto-generated constructor stub
}/***@seeHttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)*/
protected voiddoGet(HttpServletRequest request,
HttpServletResponse response)throwsServletException, IOException {
PrintWriter out=response.getWriter();try{//get the initial context
InitialContext context = newInitialContext();//lookup the queue object
Queue queue = (Queue) context.lookup("java:comp/env/queue/queue0");//lookup the queue connection factory
QueueConnectionFactory conFactory =(QueueConnectionFactory) context
.lookup("java:comp/env/queue/connectionFactory");//create a queue connection
QueueConnection queConn =conFactory.createQueueConnection();//create a queue session
QueueSession queSession = queConn.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);//create a queue receiver
QueueReceiver queReceiver =queSession.createReceiver(queue);//start the connection
queConn.start();//receive a message
TextMessage message =(TextMessage) queReceiver.receive();//print the message
out.write("Message Received: " +message.getText());//close the queue connection
queConn.close();
}catch(Exception e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}/***@seeHttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)*/
protected voiddoPost(HttpServletRequest request,
HttpServletResponse response)throwsServletException, IOException {//TODO Auto-generated method stub
}
}
验证结果
在Tomcat里运行该Web工程,执行消息生产者Servlet,返回消息发送成功标志,同时我们可以在http://localhost:8161/admin/queues.jsp查看到该消息,如下图所示
继续执行消息消费者Servlet,返回消息接收成功标志,同时我们可以打开http://localhost:8161/admin/queues.jsp页面,发现刚才的消息已经不见了,如下图所示
参考资料