1. 程式人生 > >基於Tomcat + JNDI + ActiveMQ實現JMS的點對點訊息傳送

基於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.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頁面,發現剛才的訊息已經不見了,如下圖所示

參考資料

相關推薦

基於Tomcat + JNDI + ActiveMQ實現JMS訊息傳送

前言   寫了一個簡單的JMS例子,之所以使用JNDI 是出於通用性考慮,該例子使用JMS規範提供的通用介面,沒有使用具體JMS提供者的介面,這樣可以保證我們編寫的程式適用於任何一種JMS實現(ActiveMQ、HornetQ...)。 什麼是JNDI   JNDI(Java Naming and Di

[ActiveMQ實戰]基於JMS訊息傳播

      ActiveMQ是基於JMS實現的,JMS是J2EE規範中的一個。它有兩種訊息傳播方式:點對點和釋出/訂閱模式。其中EJB的MDB(訊息驅動bean)也是基於JMS實現的。ActiveMQ是一個開源的訊息服務匯流排。下面通過一個例項逐步認識它。這裡主要講解點對點

JMS消息隊列ActiveMQ(模式)

jms activemq 消息隊列 生產者(producer)->消息隊列(message queue)package com.java1234.activemq; import javax.jms.Connection; import javax.jms.ConnectionFactor

SpringBoot+ActiveMq實現(Queue)訊息佇列

上篇博文主要分析了三種不同的請求方式,其中提到了基於訊息佇列的請求,當然只是從理論的角度去進行了分析,本篇博文就再次結合具體實現來說說訊息佇列。 一、什麼是訊息佇列? 作為中介軟體,訊息佇列是分散式應用間交換資訊的重要元件。訊息佇列可駐留在記憶體或磁碟上, 佇列可以儲存訊息直到它

《Pro Spring》學習筆記之Spring+ActiveMQ實現Queue通訊(

spring配置檔案: <?xml version="1.0" encoding="UTF-8"?><beans    xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="h

ActiveMQ 實現訊息模型小Demo

      摘要:JMS(JAVA Message Service,java訊息服務) API是一個訊息服務的標準或者說是規範,允許應用程式元件基於JavaEE平臺建立,傳送,接受和讀取訊息.它使分散式通訊耦合度更低,訊息服務更加可靠以及非同步性  JMS有兩種訊息模型:點

使用ActiveMQ+MQTT實現Android訊息通知

使用ActiveMQ+MQTT實現Android點對點訊息通知 [email protected] 2013-12-20 實現點對點訊息通知的關鍵問題 ActiveMQ使用MQTT協議,加上android上的paho包,即可簡單實現訊息通知功能,但是mqtt協議只

activeMQ

ssa oca exceptio pac 開啟事務 ive mes 啟動 cal 摘要: ActiveMQ 點對點消息 Point-to-Point 是一對一 創建消息生產者 /** * 點對點消息生產者 * * @author Edward * */

HTML5 WebSocket實現聊天的示例代碼

HTML案例分析 HTML5講解 HTML5的websocket與Tomcat實現了多人聊天,那是最簡單也是最基本的,其中註意的就是開發環境,要滿足jdk1.7和tomcat8,當然了tom7的7.063也行,在網站上找到了用google關於websocket的點對點聊天,更好的是可以和大多數系統很好

[NodeJS]NodeJS基於WebSocket的多用戶即時通訊聊天

round serve i++ conn console 即時通訊 .get () str 最近給一個客戶做了一個聊天,所以就用NodeJS做了一個 原理就是用戶第一次進入後,記錄它的ID和該用戶的ws 等有人發數據的時候,就去查ID,然後找到ID對應的ws,進行消息發

基於開源算法實現圖片比進行圖片全圖和局部 比

== transform col reads img 希望 object 兩個 最新 需要最新源碼,或技術提問,請加QQ群:538327407,由於源碼在不斷完善,會在之後同步到AI開源項目中 一、需求 需要針對藝術品 局部和全圖進行相識度比對,從而識別圖片的真

SpringBoot整合ActiveMQ訊息佇列和雙向佇列、與釋出訂閱

ActiveMQ 是Apache出品,最流行的,能力強勁的開源訊息匯流排。ActiveMQ 是一個完全支援JMS1.1和J2EE 1.4規範的 JMS Provider實現,儘管JMS規範出臺已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演著特殊的地位。 &nbs

SpringBoot2.0之整合ActiveMQ模式)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/

spring boot中使用websocket實現通訊與伺服器推送

WebSocket介紹    websocket是html中一種新的協議,它實現了真正的長連線,實現了瀏覽器與伺服器的全雙工通訊(指在通訊的任意時刻,線路上存在A到B和B到A的雙向訊號傳輸)。 現在我們接觸的協議大多是htttp協議,在瀏覽器中通過http協議實現了單向的通訊

activemq模式createQueue

1.生產者JMSProducer package com.java1234.activemq; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; i

nodejs 使用nodejs-websocket模組實現實時通訊

1、首先安裝好nodejs-websocket npm install nodejs-websocket --save -g 2、編寫服務端 var ws = require("nodejs-websocket") var AllUserData = new Array(

Spring Boot整合websocket實現群聊,聊天,圖片傳送,音訊傳送

參考:基於https://blog.csdn.net/qq_38455201/article/details/80374712  基礎上進行新增圖片傳送和音訊傳送功能   單點圖片傳送: 單點音訊傳送: 音訊傳送相關js參考:https://github.

java使用Netty實現聊天

最近學習伺服器開放,實現客戶端(APP)與硬體裝置之間的通訊,我一想到socket,經過查詢資料發現socket實現起來非常麻煩,同時也發現一個比較好的框架netty,覺得很不錯,就開始嘗試用他來擼一個點對點聊天系統,想了解的小夥伴可以自行去學習一下netty 一、一開始是導包,我是匯入

activemq的幾種基本通訊方式總結(-釋出訂閱)

簡介      在前面一篇文章裡討論過幾種應用系統整合的方式,發現實際上面向訊息佇列的整合方案算是一個總體比較合理的選擇。這裡,我們先針對具體的一個訊息佇列Activemq的基本通訊方式進行探討。activemq是JMS訊息通訊規範的一個實現。總的來說,訊息規範裡面定義最常見的幾種訊息通訊模式主要有

基於TCP協議的通訊java程式,帶圖形介面

客戶端 package client; import java.awt.*; import java.awt.event.*; import java.io.DataInputStream; import java.io.DataOutputStream;