什麼是訊息
#鬆散耦合的非同步通訊過程
1. 面向訊息的中間件(MOM): 訊息發送者稱為生產者; 儲存訊息的位置稱為目的地; 接受訊息的元件稱為消費者
2. 訊息模型:
a. 點對點:目的地成為佇列,訊息只能被消費一次
b. 發佈-訂閱:目的地成為主體,消費者稱為訂閱者,訊息能被任意數量消費
1. JMS API:提供使用Java存取MOM(訊息中介軟體)的統一標準方式
2. 開發訊息生產者流程:
a. 使用依賴注入,取得連線工廠ConnectionFactory和目的地Destination物件
b. 使用連接工廠的createConnection開啟連線Connection
#
c. 使用連線Connection的createSession建立會話Session並指定交易參數
d. 使用會話Session的createProducer建立貨運佇列Producer
#
e. 使用會話Session的createMessage建立訊息Message並設定
f. 使用貨運隊列Producer的send發送訊息
g. 釋放資源
注意: 以上流程是基於JavaEE 6 的情況下, JavaEE 7 提供了更簡易的A開發流程
3. Message介面: 訊息頭, 訊息屬性, 訊息體; 實作類別: ObjectMessage傳遞物件, ByteMessage傳遞位元組, MapMessage傳遞Map, StreamMessage傳遞流資料, TextMessage傳遞文字
# 1. 優點:多執行緒,簡化的訊息代碼
2. 設計原則:
a. MDB類別必須直接或間接實作訊息監聽器介面
b. 必須是具體的公開的,不能是final和抽象類別
c. 必須是POJO,不能是另一個MDB的子類別
d. 必須有無參的建構者
e. 不能有final方法
f. 不能拋出任何運行時異常,因為當拋出是MDB實例將被終止
3. 使用MDB開發消費者流程
a. 使用註解@MessageDriven把類別標記為MDB並且指定MDB配置
b. 實作MessageListener介面, 並實作onMessage方法
c. 在onMessage中實作邏輯
# 4. @MessageDriven: 註解被註解的類別為MDB, 此註解有3個參數, name指定MDB的名稱, messageListenerInterface指定MDB實作的訊息介面(可以直接在類別上implements介面), activationConfig用於指定專有的配置屬性
5. MessageLisener: 把MDB註冊為訊息消費者, 可依不同場景實現不同監聽器介面
6. ActivationConfigProperty: 配置訊息系統的設定資訊
a. destinationType: 通知容器該MDB監聽的是佇列還是主題
b. connectionFactoryJndiName: 指定用於建立MDB的JMS連接的連接工廠JDNI
c. destianName: 指定正在監聽的目的地
d. acknowledgeMode: 指定JMS會話確認模式
e. subscriptionDurability: 用於設定為持久訂閱者
f. messageSelector: 過濾訊息
#
7. MDB生命週期:
a. 建立MDB實例並設定它們
b. 注入資源
c. 存放到受管理的池中
d. 當偵測到訊息到達時監聽的目的地時,從池中取出空閒bean
e. 執行訊息監聽器方法,即onMessage方法
f. 當onMessage方法執行完畢,把空閒bean存回池中
g. 根據需求從池中撤銷/銷毀bean
8. 從MDB發送訊息: 從JNDI注入佇列, 連接工廠物件, 然後和Java訊息一樣的操作
9. 管理事務: 正常情況下, 在onMessage方法前開啟事務, 方法結束時提交事務. 可以透過訊息上下文物件rollback交易
1. 根據使用情況選擇是否使用MDB
# 2. 選擇訊息模型: 應在程式設計時決定是PTP還是發布-訂閱, 但幸運的是, 兩者間切換僅僅需要修改配置即可
3. 保持模組化: MDB的onMessage方法不應該處理業務邏輯, 業務邏輯應該放在對應的會話bean, 並註入MDB, MDB負責呼叫對應的會話bean
4. 根據場景充分使用濾鏡或分割目的地
5. 選擇訊息類型: 根據使用場景選擇傳輸時使用的訊息類型
# 6. 警惕有毒消息: 無法消費但又回滾了的消息會陷入無限循環的接收/回滾中, 雖然個別廠商有自己的處理死消息的實現, 但是在編程的時候要注意
7. 配置MDB池額大小: 根據場景與需求配置
參考
EJB 3 in Action, Second Edition
以上是 什麼是訊息鬆散耦合的非同步通訊過程?的詳細內容。更多資訊請關注PHP中文網其他相關文章!