Java Message Service (JMS) 定義兩種訊息模型:
本範例示範 Queue 模式,適用於訂單處理、非同步任務等「至少一次」處理場景。
├── ExampleMDB.java // 訊息驅動 Bean (消費者)
├── Client.java // 獨立 Java 客戶端 (生產者)
├── queue-example-service.xml // JBoss MBean 部署描述符
└── log4j.properties // 日誌設定
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()ClientInitialContext 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 查找 → 建立連線/會話/發送者 → 發送訊息。
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>
depends 確保 DestinationManager 先啟動run.bat -c all (Windows) 或 ./run.sh -c all (Linux)queue-example-service.xml 至 server/all/deployClient.java 發送測試訊息Received messagehttps://localhost:8080/jmx-console/ 搜尋 name=tutorial| 問題 | 解決方案 |
|---|---|
| 訊息重複消費 | 冪等設計:業務邏輯加唯一鍵檢查,或使用事務性會話 Session.SESSION_TRANSACTED |
| 訊息堆積 | 監控 Queue 深度,配置 MaxDeliveryAttempts 進入 DLQ (Dead Letter Queue) |
| 連線洩漏 | 客戶端務必在 finally 關閉 Connection、Session |
| 序列化異常 | 訊息物件實作 Serializable,版本號 serialVersionUID 固定 |
messaging-activemq 子系統spring-boot-starter-artemis,使用 @JmsListener 替代 MDBEJB 3.0 MDB 以註解簡化 JMS 開發,容器管理生命週期與併發。掌握 Queue/Topic 差異、部署描述符、客戶端發送流程,是 Java EE 訊息驅動開發的基石。