你的位置:首页 > Java教程

[Java教程]基于Tomcat + JNDI + ActiveMQ实现JMS的点对点消息传送


  写了一个简单的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.

 <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/