1. 程式人生 > >JMS規範 佇列模式與主題模式

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 /