JMS規範 佇列模式與主題模式
Java訊息服務定義
Java訊息服務(Java Message Service)應用程式介面,是一個Java平臺中關於面向訊息中介軟體的API,用於在兩個應用程式之間,或分散式系統中傳送訊息,進行非同步通訊。
JMS相關概念
提供者:實現JMS規範的訊息中介軟體伺服器
客戶端:傳送或接收訊息的應用程式
生產者/釋出者:建立併發送訊息的客戶端
消費者/訂閱者:接收並處理訊息的客戶端
訊息:應用程式之間傳遞的資料內容
訊息模式:在客戶端之間傳遞訊息的模式,JMS中定義了主題和佇列兩種模式
JMS訊息模式:佇列模式(Queue模式)
客戶端包括生產者和消費者
佇列中的訊息只能被一個消費者消費
消費者可以隨時消費佇列中的訊息
佇列模型示意圖
JMS訊息模式:主題模型
客戶端包括髮布者和訂閱者
主題中的訊息被所有訂閱者消費
消費者不能消費訂閱之前就傳送到主題中的訊息
主題模型示意圖
佇列模式的訊息演示
使用JMS介面規範連線ActiveMQ
建立生產者
建立消費者
建立釋出者
建立訂閱者
JMS編碼介面之間的關係
程式碼演示
1.編寫AppProducer類
package com.myimooc.jms.queue; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; /** * App 生產者-佇列模式 * @author ZhangCheng on 2017-07-22 * */ public class AppProducer { /** 指定ActiveMQ服務的地址 */ private static final String URL = "tcp://127.0.0.1:61616"; /** 指定佇列的名稱 */ private static final String QUEUE_NAME = "queue-test"; public static void main(String[] args) throws JMSException { // 1.建立ConnectionFactory ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(URL); // 2.建立Connection Connection connection = connectionFactory.createConnection(); // 3.啟動連線 connection.start(); // 4.建立會話(第一個引數:是否在事務中處理) Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 5. 建立一個目標 Destination destination = session.createQueue(QUEUE_NAME); // 6.建立一個生產者 MessageProducer producer = session.createProducer(destination); for (int i = 0; i < 100; i++) { // 7.建立訊息 TextMessage textMessage = session.createTextMessage("test" + i); // 8.釋出訊息 producer.send(textMessage); System.out.println("訊息傳送:" + textMessage.getText()); } // 9.關閉連線 connection.close(); } }
2.編寫AppConsumer類
package com.myimooc.jms.queue; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageConsumer; import javax.jms.MessageListener; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; /** * App 消費者-佇列模式 * @author ZhangCheng on 2017-07-22 * */ public class AppConsumer { /** 指定ActiveMQ服務的地址 */ private static final String URL = "tcp://127.0.0.1:61616"; /** 指定佇列的名稱 */ private static final String QUEUE_NAME = "queue-test"; public static void main(String[] args) throws JMSException { // 1.建立ConnectionFactory ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(URL); // 2.建立Connection Connection connection = connectionFactory.createConnection(); // 3.啟動連線 connection.start(); // 4.建立會話(第一個引數:是否在事務中處理) Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 5.建立一個目標 Destination destination = session.createQueue(QUEUE_NAME); // 6.建立一個消費者 MessageConsumer consumer = session.createConsumer(destination); // 7.建立一個監聽器 consumer.setMessageListener(new MessageListener() { public void onMessage(Message message) { TextMessage textMessage = (TextMessage)message; try { System.out.println("接收訊息:" + textMessage.getText()); } catch (JMSException e) { System.out.println("接收訊息異常:"); e.printStackTrace(); } } }); // 8.關閉連線 //connection.close(); } }
主題模式的訊息演示
程式碼演示
1.編寫AppProducer類
package com.myimooc.jms.topic;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* App 生產者-主題模式
* @author ZhangCheng on 2017-07-22
*
*/
public class AppProducer {
/** 指定ActiveMQ服務的地址 */
private static final String URL = "tcp://127.0.0.1:61616";
/** 指定主題的名稱 */
private static final String TOPIC_NAME = "topic-test";
public static void main(String[] args) throws JMSException {
// 1.建立ConnectionFactory
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(URL);
// 2.建立Connection
Connection connection = connectionFactory.createConnection();
// 3.啟動連線
connection.start();
// 4.建立會話(第一個引數:是否在事務中處理)
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 5. 建立一個目標
Destination destination = session.createTopic(TOPIC_NAME);
// 6.建立一個生產者
MessageProducer producer = session.createProducer(destination);
for (int i = 0; i < 100; i++) {
// 7.建立訊息
TextMessage textMessage = session.createTextMessage("test" + i);
// 8.釋出訊息
producer.send(textMessage);
System.out.println("訊息傳送:" + textMessage.getText());
}
// 9.關閉連線
connection.close();
}
}
2.編寫AppConsumer類
package com.myimooc.jms.topic;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* App 消費者-主題模式
* @author ZhangCheng on 2017-07-22
*
*/
public class AppConsumer {
/** 指定ActiveMQ服務的地址 */
private static final String URL = "tcp://127.0.0.1:61616";
/** 指定主題的名稱 */
private static final String TOPIC_NAME = "topic-test";
public static void main(String[] args) throws JMSException {
// 1.建立ConnectionFactory
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(URL);
// 2.建立Connection
Connection connection = connectionFactory.createConnection();
// 3.啟動連線
connection.start();
// 4.建立會話(第一個引數:是否在事務中處理)
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 5.建立一個目標
Destination destination = session.createTopic(TOPIC_NAME);
// 6.建立一個消費者
MessageConsumer consumer = session.createConsumer(destination);
// 7.建立一個監聽器
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage)message;
try {
System.out.println("接收訊息:" + textMessage.getText());
} catch (JMSException e) {
System.out.println("接收訊息異常:");
e.printStackTrace();
}
}
});
// 8.關閉連線
//connection.close();
}
}
相關推薦
JMS規範 佇列模式與主題模式
Java訊息服務定義Java訊息服務(Java Message Service)應用程式介面,是一個Java平臺中關於面向訊息中介軟體的API,用於在兩個應用程式之間,或分散式系統中傳送訊息,進行非同步通訊。JMS相關概念提供者:實現JMS規範的訊息中介軟體伺服器客戶端:傳送
(八)RabbitMQ訊息佇列-通過Topic主題模式分發訊息
前兩章我們講了RabbitMQ的direct模式和fanout模式,本章介紹topic主題模式的應用。如果對direct模式下通過routingkey來匹配訊息的模式已經有一定了解那fanout也很好理解。簡單的可以理解成direct是通過routingkey精準匹配的,而topic是通過r
SpringBoot整合JmsTemplate(佇列模式和主題模式)(xml和JavaConfig配置實現)
1.匯入jar包: <!--jmsTemplate--> <dependency> <groupId>org.springframework.boot</groupId>
ActiveMQ的佇列模式和主題模式
佇列模式 例項程式碼 /** * 生產者 */ public class AppProducer { private static final String url="tcp://192.168.63.137:61616"; private static fi
AMD模式與CMD模式
提前 角度 處理方式 沒有 全局 div 模塊 多個 amd AMD模式與CMD模式區別 1. 對於依賴的模塊,AMD 是提前執行,CMD 是延遲執行。不過 RequireJS 從 2.0 開始,也改成可以延遲執行(根據寫法不同,處理方式不同)。CMD 推崇 as l
[CentOS 7系列]VIM編輯模式與命令模式
用戶 mtime 一、編輯模式按鍵作用i在當前字符前插入I在光標所在行的行首插入a在當前字符後插入A在光標所在行的行尾插入o在當前行的下一行插入新的一行O在當前的上一行插入新的一行二、命令模式命令作用/word向光標之後查找一個字符word,按n向後繼續搜索?word向光標之前查找一個字符word,按
Linux 修改root密碼 單用戶模式與救援模式
linux 密碼修改 單用戶模式 救援模式單用戶模式重啟Linux進入GRUB界面在系統啟動界面,例如 選擇第一項,並按e鍵,進入edit界面,找到linux16開頭的行,將光標移至ro處,將ro修改為rw init=/sysroot/bin/sh 按Ctrl+X鍵啟動啟動後進入如下所示界面,先
activeMQ隊列模式和主題模式的Java實現
ons javax try nfa port 實現 catch n) tac 一、隊列模式 生產者 import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Dest
瀏覽器標準模式與怪異模式-CSS1Compat and BackCompat
方法 set code frameset http ctype nal cnblogs 16px 由於歷史的原因,各個瀏覽器在對頁面的渲染上存在差異,甚至同一瀏覽器在不同版本中,對頁面的渲染也不同。在W3C標準出臺以前,瀏覽器在對頁面的渲染上沒有統一規範,產生了差
Outlook 2013連接到Office 365時緩存模式與聯機模式下的流量問題
office 365 outlook 2013 exchange 緩存模式 最近在遷移Office 365時,碰到一個流量居高不下,帶寬不夠用的問題,環境如下:Office 365 E5訂閱國際版,用戶端使用Outlook2013連接O365郵箱,600用戶,50M Office365專用帶寬,當
混雜模式與標準模式總結
mod 默認 內容 也會 XML 使用 聲明 doc 參考 1 區分模式的意義? IE5.5引入了文檔模式的概念,通過使用DOCTYPE實現模式切換,它的主要作用是告訴瀏覽器以哪種模式呈現,如何解析文檔,也就是說兩種模式主要影響CSS內容的呈現,某些情況下也會影響JavaS
實模式與保護模式
虛擬存儲器 有效 偏移 進程 代碼 訪問權限 描述符 兼容 ont 1. 實模式,又叫實地址模式,CPU完全按照8086的實際尋址方法訪問從00000h--FFFFFh(1MB大小)的地址範圍的內存,在這種模式下,CPU只能做單任務運行;尋址公式為:物理地址=左移4位的段
zabbix主動模式與被動模式、添加監控主機、添加自定義模板
Linux學習筆記zabbix主動模式與被動模式 添加監控主機 添加自定義模板 1.將原來的模板下載下來,刪除自己不需要的,導入時要更改名字。 2.創建一個鏈接的模板,取消鏈接後,在刪除模板中不想要的選項。 處理圖形中的亂碼 zabbix主動模式與被動模式、添加監控主機、添加自定義模板
使用Java編寫ActiveMQ的隊列模式和主題模式
ActiveMQ 消息中間件 分布式 主題模式 隊列模式 隊列模式的消息演示 本小節簡單演示一下如何使用JMS接口規範連接ActiveMQ,首先創建一個Maven工程,在pom.xml文件中,添加activemq的依賴: <dependencies> <depen
【轉】策略模式與命令模式區別
區別 相同 策略模式 菜單 nbsp 之間 mman 變化 排隊 策略模式 把易於變化的行為分別封裝起來,讓它們之間可以互相替換, 讓這些行為的變化獨立於擁有這些行為的客戶。GoF《設計模式》中說道:定義一系列算法,把它們一個個封裝起來,並且使它們可以相互替換。該模式使得算
孿生兄弟狀態模式與策略模式有什麽區別,究竟該如何選擇
一段 如何解決 影片 工作 設置 飛機 等等 gety 兩種 都說狀態模式和策略模式很像,它們的 UML 類圖一樣。這也說明,單純從代碼角度來講,它們的本質一樣,其實都是多態的應用。但它們實際所代表的的事物特征是有本質區別的,選擇哪個設計模式,代表了你看待業務場景的角度。從
標準模式與混雜模式
DOCTYPE 的一個重要作用就是告訴瀏覽器,它該以何種模式呈現。 我們通過document.compatMode這個屬性來檢測,當前頁面處於何種模式: CSS1Compat:標準模式 BackCompat:混雜模式 那麼,問題來了,什麼情況下頁面會處於混雜模式呢?
JS正則表示式:量詞的貪婪模式與惰性模式的區別
在說明貪婪模式與惰性模式區別之前,說明一下JS正則基礎: 1.寫法法基礎: regexObj.test(str);例如/123/.test(‘123’); 2.基本語法 錨點:匹配一個位置 ^表示起始位置;/^a/.test(‘str’);表示是否以a開頭
單例模式與工廠模式
最近突然想起單例模式及工廠模式這兩個概念,特此整理了一下: 單例模式: 在某一個時刻 某個類只允許被建立一個。 public class single(){ 私有的無參構造方法 private single(){ } 建立私有靜態資源物件 private static s
Python 基礎學習之命令列模式與互動模式的區別
命令列模式:即在win10搜尋框中,直接跳出來的頁面。在此模式下,可以通過執行程式碼"python .py"執行.py檔案。需要注意的是,在此模式下,如果要執行的程式碼檔案不在當前目錄,需要使用cd進行切換,假設我的py檔案在E:\python\demo,那麼需要執行的程式碼指令是“cd /