基於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;