转自:http://www.cnblogs.com/chenpi/p/5565618.html
前言
写了一个简单的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,添加如下配置:
<Resource name="queue/connectionFactory" auth="Container" type="org.apache.activemq.ActiveMQConnectionFactory" description="JMS Connection Factory" factory="org.apache.activemq.jndi.JNDIReferenceFactory" brokerURL="tcp://localhost:61616" brokerName="LocalActiveMQBroker" /> <Resource name="queue/queue0" auth="Container" type="org.apache.activemq.command.ActiveMQQueue" description="My Queue" factory="org.apache.activemq.jndi.JNDIReferenceFactory" physicalName="TomcatQueue" />
启动ActiveMQ
CMD到ActiveMQ安装路径下的bin目录,输入“activemq start”指令即可启动,可在浏览器中输入地址http://localhost:8161/admin,查看队列、话题等信息。
编写一个Web工程
eclipse上新建web工程,添加ActiveMQ依赖的jar包,然后开始编写两个Servlet,一个用于生产消息,另一个用于消费消息,如下代码:
消息生产者Servlet:
import java.io.IOException; import java.io.PrintWriter; import javax.jms.DeliveryMode; 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.InitialContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class JMSTest */ @WebServlet("/Send") public class Send extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public Send() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); try { // get the initial context InitialContext context = new InitialContext(); // 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(); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }
消息消费者Servlet:
import java.io.IOException; import java.io.PrintWriter; import javax.jms.Queue; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; import javax.jms.QueueReceiver; import javax.jms.QueueSession; import javax.jms.Session; import javax.jms.TextMessage; import javax.naming.InitialContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class Receive */ @WebServlet("/Receive") public class Receive extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public Receive() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); try { // get the initial context InitialContext context = new InitialContext(); // 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(); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }
验证结果
在Tomcat里运行该Web工程,执行消息生产者Servlet,返回消息发送成功标志,同时我们可以在http://localhost:8161/admin/queues.jsp查看到该消息,如下图所示
继续执行消息消费者Servlet,返回消息接收成功标志,同时我们可以打开http://localhost:8161/admin/queues.jsp页面,发现刚才的消息已经不见了,如下图所示
参考资料
http://howtodoinjava.com/jms/jms-point-to-point-message-example/
相关推荐
### Spring+JMS+ActiveMQ+Tomcat 实现消息服务 #### 一、技术栈介绍 在本案例中,我们采用的技术栈为Spring 2.5、ActiveMQ 5.4.0 和 Tomcat 6.0.30。这些技术的结合能够有效地构建一个可靠的消息传递系统。 - **...
Tomcat6+Spring+JNDI配置数据源说明 本文档主要介绍了Tomcat6+Spring+JNDI配置数据源的详细步骤和原理...本文档提供了详细的 Tomcat6+Spring+JNDI 配置数据源的步骤和原理,可以帮助开发者快速了解和实现数据源配置。
在Tomcat中,JNDI实现是基于标准JNDI API的,但针对Web应用服务器做了特定优化。它使用`org.apache.naming.NamingContext`作为其上下文实现,这使得开发者可以通过简单的JNDI调用来访问配置的资源。 ##### 2.2 ...
在tomcat 下的context.xml文件中加入 auth="Container" type="org.apache.activemq.ActiveMQConnectionFactory" description="JMS Connection Factory" factory="org.apache.activemq.jndi....
eclipse+mysql+tomcat配置JNDI实现例子 博文链接:https://uuplace.iteye.com/blog/88878
在Tomcat的conf/context.xml中的元素里面加上如下配置: auth="Container" type="org.apache.activemq.ActiveMQConnectionFactory" description="JMS Connection Factory" factory="org.apache.activemq....
例如,在Struts应用中,可以通过JNDI查找数据源,以实现对数据库的操作。 **Ajax** Ajax是一种在不刷新整个页面的情况下,通过后台与服务器异步交换数据并局部更新页面的技术。它结合了JavaScript、XML(或JSON)...
TOMCAT8 JNDI对用户名和密码加密
首先,C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,提供了对JDBC3规范和JDBC2的标准扩展的支持。使用C3P0能够有效地管理和重用数据库连接,避免频繁创建和销毁连接导致的性能损耗。 在Tomcat6中配置C3P...
【ActiveMQ-JMS简单实例使用Tomcat】是一个关于如何在Tomcat环境下集成并使用ActiveMQ进行JMS消息传递的初级教程。ActiveMQ是一款开源的消息中间件,它遵循JMS(Java Message Service)1.1规范,能兼容J2EE1.4及以上...
【JSP+Servlet+JNDI实现酒店管理系统详解】 在IT行业中,开发Web应用程序时,JSP(JavaServer Pages)和Servlet是常见的技术选择,它们为构建动态网站提供了强大的功能。JSP主要用于视图层,而Servlet则处理业务...
。。Spring11MVC+JNDI+Tomcat配置数据源.docx
。。Spring11MVC+JNDI+Tomcat配置数据源.pdf
### SpringMVC+JNDI+Tomcat配置数据源 #### 一、简介 在Java Web开发中,数据源(DataSource)是管理数据库连接的重要组件。SpringMVC框架结合Java Naming and Directory Interface (JNDI) 和Apache Tomcat服务器...
Apache ActiveMQ 是一个流行的开源消息中间件,它实现了Java消息服务(JMS)规范,允许应用程序之间进行异步通信。在本文中,我们将探讨如何在Tomcat服务器上设置和使用ActiveMQ的简单实例。 **一、ActiveMQ的特点...
《深入理解Tomcat JNDI》 在Java应用服务器中,Tomcat是一个广泛使用的轻量级服务器,而JNDI(Java ...而`tomcat-jndi.jar`这个库文件,正是Tomcat实现JNDI功能的核心组件,包含了处理JNDI操作所需的所有类和接口。
整合ActiveMQ和Tomcat的好处在于,它允许Web应用程序利用ActiveMQ的强大功能,如发布/订阅模式和点对点模式的消息传递,以及高可用性和故障恢复能力。同时,由于ActiveMQ是独立于Tomcat运行的,因此可以与其他应用...
在IT行业中,Linux操作系统常被用作服务器平台,因为它提供了稳定性和安全性。...同时,理解并熟练掌握这些步骤对于Java开发者和系统管理员来说至关重要,因为它们是构建和维护基于Java的Web应用的基础。