首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JBoss EJB 3.0 MDB 開發實戰:Queue 點對點訊息驅動 Bean

     編輯:Java 相關知識

JMS 基礎概念回顧

Java Message Service (JMS) 定義兩種訊息模型:

  • Queue (Point-to-Point):一條訊息僅被一個消費者接收,負載均衡語意
  • Topic (Publish/Subscribe):一條訊息廣播給所有訂閱者,發布-訂閱語意

本範例示範 Queue 模式,適用於訂單處理、非同步任務等「至少一次」處理場景。

專案結構

├── ExampleMDB.java          // 訊息驅動 Bean (消費者)
├── Client.java              // 獨立 Java 客戶端 (生產者)
├── queue-example-service.xml // JBoss MBean 部署描述符
└── log4j.properties         // 日誌設定

核心代碼解析

1. MDB 實現:ExampleMDB

@MessageDriven(activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/tutorial/example")
})
public class ExampleMDB implements MessageListener {
    public void onMessage(Message recvMsg) {
        System.out.println("----------------");
        System.out.println("Received message");
        System.out.println("----------------");
    }
}
  • @MessageDriven:標記為 MDB,EJB 容器自動建立訊息監聽器容器
  • activationConfig:指定目的地類型與 JNDI 名稱
  • 實現 MessageListener,容器呼叫 onMessage()

2. 客戶端生產者:Client

InitialContext ctx = new InitialContext();
Queue queue = (Queue) ctx.lookup("queue/tutorial/example");
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");

QueueConnection conn = factory.createQueueConnection();
QueueSession session = conn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueSender sender = session.createSender(queue);

TextMessage msg = session.createTextMessage("Hello World");
sender.send(msg);

關鍵步驟:JNDI 查找 → 建立連線/會話/發送者 → 發送訊息。

3. JBoss 佇列部署:queue-example-service.xml

<mbean code="org.jboss.mq.server.jmx.Queue"
       name="jboss.mq.destination:service=Queue,name=tutorial">
    <depends optional-attribute-name="DestinationManager">
        jboss.mq:service=DestinationManager
    </depends>
    <attribute name="JNDIName">queue/tutorial/example</attribute>
</mbean>
  • MBean 註冊到 JMX 控制台,可視化管理
  • depends 確保 DestinationManager 先啟動

部署與驗證步驟

  1. 啟動 JBoss:run.bat -c all (Windows) 或 ./run.sh -c all (Linux)
  2. 部署 EJB JAR 含 queue-example-service.xml 至 server/all/deploy
  3. 執行 Client.java 發送測試訊息
  4. 查看主控台輸出:Received message
  5. JMX Console 驗證:https://localhost:8080/jmx-console/ 搜尋 name=tutorial

常見坑點與最佳實踐

問題解決方案
訊息重複消費冪等設計:業務邏輯加唯一鍵檢查,或使用事務性會話 Session.SESSION_TRANSACTED
訊息堆積監控 Queue 深度,配置 MaxDeliveryAttempts 進入 DLQ (Dead Letter Queue)
連線洩漏客戶端務必在 finally 關閉 Connection、Session
序列化異常訊息物件實作 Serializable,版本號 serialVersionUID 固定

現代化遷移建議

  • WildFly / JBoss EAP 7+ 採用 Artemis MQ,配置檔改為 messaging-activemq 子系統
  • Spring Boot 整合 spring-boot-starter-artemis,使用 @JmsListener 替代 MDB
  • 雲原生架構考慮 Kafka、RabbitMQ、Pulsar 等分散式訊息中介軟體

總結

EJB 3.0 MDB 以註解簡化 JMS 開發,容器管理生命週期與併發。掌握 Queue/Topic 差異、部署描述符、客戶端發送流程,是 Java EE 訊息驅動開發的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved