1. 程式人生 > >EJB學習筆記——JMS和訊息驅動Bean

EJB學習筆記——JMS和訊息驅動Bean

JMS和訊息驅動Bean

1.java訊息服務(JMS)程式設計:

應用程式A傳送一條訊息到訊息伺服器的某個目的地,然後訊息伺服器把訊息轉發給應用程式B,由於JMS允許訊息傳送方和接收方不同時線上,沒有程式碼關聯,從而實現應用程式的解耦,JMS的過程如下:

應用程式A——>訊息——>JMS訊息伺服器——>訊息——>應用程式B

2.JMS訊息的傳遞模型:

JMS支援兩種訊息傳遞模型:點對點(PTP)、釋出訂閱(pub/sub)

(1).PTP

一條訊息只能傳遞給一個接收方,採用javax.jms.Queue表示。

每個訊息被髮送到一個特定的訊息佇列中,接收者從訊息佇列中獲取訊息,佇列保留著訊息直到訊息被消費或者超時,當傳送時如果接收方不線上,則當接收方上線時還可以接收到訊息。

傳送者和接收者之間在時間上沒有依賴性,即當傳送者傳送了訊息之後,不管接收者是否在執行,都不會影響訊息被髮送到訊息佇列,接收者在成功接收訊息之後需要向佇列應答成功,若希望傳送的每條訊息都應該被成功接收處理的話,應該使用PTP方式。

(2).pub/sub

一條訊息可以傳遞給多個接收方,採用javax.jms.Topic表示。

每條訊息可以有多個接收者,釋出者和訂閱者有時間上的依賴性,針對某個主題的訂閱者必須建立一個訂閱之後才能消費釋出者釋出的訊息,而且為了接收訊息,訂閱者必須保持執行。釋出訂閱模式的訊息不支援離線訊息,即當發生訊息時,接收方如果不線上,當接收再次上線時就無法接收到已經發送過的訊息。

為了緩和這種嚴格的時間相關性,jms執行訂閱者建立一個可持久化的訂閱,這樣,即使訂閱者沒有被啟用(執行),也能接收到釋出者釋出的訊息。

若希望傳送的訊息可以不被做任何處理,或者被一個消費者處理,或者可以被多個消費者處理,應該使用pub/sub模型。

兩種訊息模型都繼承自:javax.jms.Destination類。

3.JMS訊息組成:

JMS中一條訊息的組成:訊息頭(header)、屬性(property)、訊息體(body)

所有的訊息都派生自Message介面,有以下幾種型別:

(1).StreamMessage:一種主體中包含java二進位制流的訊息,其填充和讀取均按順序進行。

(2).MapMessage

:一種主體中包含一組鍵值對的訊息,沒有定義條目順序。

(3).TextMessage:一種主體中java字串的訊息(如,普通文字,xml檔案等)

(4).ObjectMessage:一種主體中包含序列化java物件的訊息。

(5).ByteMessage:一種主體中包含連續位元組流的訊息。

4.配置訊息到達目標地址(Destination)

訊息目標地址是訊息傳送的目標地址,也是訊息接收者獲取訊息的目標地址,因此在傳送jms訊息之前,需要先配置訊息的目標到達地址。

Jboss中的配置如下:

名稱以”**-service.xml”命名,

(1).PTP型別訊息目標地址的配置:

 

(2).pub/sub型別訊息目標地址的配置:

 

5.傳送JMS訊息過程:

java類中傳送jms訊息一般步驟:

(1).得到一個JNDI初始化上下文:

 

(2).根據上下文查詢JMS連線工廠:

該連線工廠是由JMS提供的,每個javaEE伺服器廠商都為它繫結一個全域性的JNDI

QueueConnectionFactory為例(TopicConnectionFactory類似)


(3).
從連線工廠得到一個JMS連線:

QueueConnection(TopicConnection類似)為例:

 

(4).通過jms連線建立一個jms會話:

QueueSession(TopicSession類似)為例:

 

第一個引數表示:不需要事物。第二個引數表示:自動確認訊息已接收的會話。

(5).查詢訊息目標地址:

 

(6).根據會話及目標地址來建立訊息生產者:

 

(7).訊息傳送完畢後,關閉會話和連線:

 

6.使用訊息驅動bean(MDB)接收訊息:

一個訊息驅動bean(MDB)通常要實現MessageListener介面,實現該介面的onMessage(Message message)方法處理接收的jms訊息(非同步方式接收jms訊息)

在訊息驅動bean前加如下註解:

 

由於訊息驅動bean使用了例項化池技術,具有處理大批量併發訊息的能力,所以非常適合應用在一些閘道器產品中。

7.JMS程式設計模型總結:

通過56具體學習了JMS傳送和接收處理訊息的流程後,總結jms程式設計模型如下:

8.JMS中訊息的兩種接收方式:

(1).同步方式:訂閱者或接收者呼叫receive方法來接收訊息,此方法在接收到訊息之前一直阻塞。

(2).非同步方式:訂閱者或接收者可以註冊為一個訊息監聽器,當訊息到達之後,系統自動呼叫監聽器的onMessage方法。

相關推薦

EJB學習筆記——JMS訊息驅動Bean

JMS和訊息驅動Bean 1.java訊息服務(JMS)程式設計: 應用程式A傳送一條訊息到訊息伺服器的某個目的地,然後訊息伺服器把訊息轉發給應用程式B,由於JMS允許訊息傳送方和接收方不同時線上,沒有程式碼關聯,從而實現應用程式的解耦,JMS的過程如下: 應用程式A——&

EJB學習筆記】——JMS訊息驅動Bean

  認識訊息驅動Bean之前,先了解一下JMS。 JMS   JMS(Java Message Service):java訊息服務,客戶端與服務端之間可以通過JSM服務進行訊息的非同步傳輸(

EJB---->JMS(Java Message Service)訊息驅動bean

訊息驅動Bean(MDB)是設計用來專門處理基於訊息請求的元件。MDB 負責處理訊息,而EJB 容器則負責處理服務(事務、安全、資源、併發、訊息確認,等等),使bean 開發者把精力集中在處理訊息的業務邏輯上。如果你不使用MDB,則必須編寫一部分這些服務。MDB 像一個沒有local 和remote 介面的無

EJB——訊息驅動Bean

驅動Bean (MDB)提供了一個實現非同步通訊比直接使用Java訊息服務(JMS)更容易地方法。建立MDB接收非同步JMS訊息。容器處理為JMS佇列和主題所要求載入處理的大部分工作。它向相關的MDB傳送所有的訊息。一個MDB允許J2EE應用傳送非同步訊息,該應用能處理這

EJB訊息驅動bean

Java Message Service 訊息傳遞系統的中心就是訊息。一條 Message 分為三個組成部分: 頭(header)是個標準欄位集,客戶機和供應商都用它來標識和路由訊息。 JMSMessageID: 標識提供者傳送的每一條訊息, 傳送過程中由提供者設定 JMS

(一)Oracle學習筆記—— 表表空間

最大 更改 默認 oracle spa mil 步驟 font lte 1. 表空間 一個數據庫可以有多個表空間,一個表空間裏可以有多個表。表空間就是存多個表的物理空間;可以指定表空間的大小位置等。 1.1 創建表空間語句 create tablespace t

python學習筆記列表元組(三)

python列表(list)是Python以及其他語言中最常用到的數據結構之一。Python使用使用中括號 [ ] 來解析列表。列表是可變的(mutable)——可以改變列表的內容。對應操作:1、查([]切片操作) name = [‘tom‘,‘張三‘,‘joker‘,‘李四‘] print(name[2])

學習筆記---buffercache的區別

cache一.概念buffer:緩沖區,一個用於存儲速度不同步的設備或優先級不同的設備之間傳輸數據的區域。cache: 緩存,位於CPU與主內存間的一種容量較小但速度很高的存儲器。保存著CPU剛用過或循環使用的一部分數據。二、應用場景buffer:由各種進程分配,被用在輸入隊列等方面。cache: 用在磁盤的

Maven學習筆記—安裝配置

src 自己 修改 分享 另一個 window 關於 1.3 頁面 Maven的安裝和配置 1 在windows上安裝maven 1.1 下載maven 訪問maven的下載頁面:http://maven.apache.org/download.cgi,選擇版本下載即可。

Python 學習筆記 -- 類實例

isdigit 特殊 .... 方法 raise fun angle 總結 area 1 #創建一個類,類是一種具有相同屬性和方法的抽象 2 #創建類需要使用class關鍵字,並且定義方法時,方法的第一個參數是self 3 class Student(object)

多線程編程學習筆記——asyncawait(二)

處理 sync ext 操作 line cnblogs 編程 技術 容器 接上文 多線程編程學習筆記——async和await(一) 三、 對連續的異步任務使用await操作符 本示例學習如何閱讀有多個await方法方法時,程序

多線程編程學習筆記——asyncawait(三)

result ask aps nta cti ise 線程編程 學習筆記 top 接上文 多線程編程學習筆記——async和await(一) 接上文 多線程編程學習筆記——async和await(二) 五、 處理異步操

php學習筆記-POSTGET的區別

nbsp 數據 post方法 常用 地址欄 限制 區別 地址 提交數據 POST和GET都可以用來提交數據。 POST方法提交的數據在瀏覽器的地址欄是不可見的,當然利用一些工具是可以看到的,而GET方法提交的數據在地址欄是可見的。兩者比較,POST更安全一點。 POST方法

Kibana學習筆記——安裝使用

分享 server 學習筆記 下載 文件夾 man soft www eight 1.首先下載Kibana https://www.elastic.co/downloads 2.解壓 tar -zxvf kibana-6.2.1-linux-x86_64.tar.g

Python學習筆記-Day61Day62-Django模板系統

主要內容: 一、模板語言-變數 二、模板語言-過濾器 三、模板語言Tags 四、csrf-token 五、母板 六、元件 七、靜態檔案相關 八、自定義tag     一、Django模板語言-變數 1、語法:{{ 變數名 }} 2、命名規則:所有的數字、字母、下劃

Godot Engine 學習筆記 場景節點

Godot Engine 學習筆記 場景和節點 場景和節點 節點 場景 場景和節點 節點 在Godot中節點作為建立遊戲得到基本構建模,且可以用與執行各種特殊的功能。 節點都具有的屬性: 名字

python程式設計:從入門到實踐學習筆記-檔案異常

從檔案中讀取資料 讀取檔案、檔案路徑 #pi_digits.txt 3.1415926535   8979323846   2643383279 #file_reader.py fillename = 'pi_digits.txt' #讀取整個檔案 with

go學習筆記-變數常量

變數和常量 變數 基本寫法 //定義一個名稱為“variableName”,型別為"type"的變數 var variableName type //定義三個型別都是“type”的變數 var vname1, vname2, vname3 type 初始化 //初始化“variableName”的

EJB學習筆記(轉存)

轉需,原文連結:http://blog.itpub.net/818/viewspace-787096/ 2004-10-13     星期三      晴 伺服器端計算(使用WSAD開發、除錯以及測試EJB

python學習筆記——生成器迭代器

一、生成器 計算機的儲存資源一向是很寶貴的,在對大量的資料進行計算時,如果是把資料統一讀到記憶體中來在進行計算就會造成大量的資源浪費。用生成器來進行算計時採用是一邊迴圈一邊計算的方式,不用一下將資料讀入記憶體,節約大量記憶體空間。 舉個簡單的列子說明: 生成一個列表,並輸出列表各項