基於Tomcat + JNDI + ActiveMQ實現JMS的點對點訊息傳送,jndiactivemq

來源:互聯網
上載者:User

基於Tomcat + JNDI + ActiveMQ實現JMS的點對點訊息傳送,jndiactivemq

  寫了一個簡單的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/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.