在 JBoss 上部署 EJB 3.0 消息驅動 Bean (MDB) 時,控制台噴 javax.naming.NameNotFoundException: myqueue not bound,導致 MDB 無法啟動監聽。本文分析原因:JBoss 不會自動創建 @ActivationConfigProperty 指定的 Queue,需手動配置 MBean 綁定 JNDI,提供兩種標準配置方式。
ERROR [org.jboss.resource.adapter.jms.inflow.JmsActivation] Unable to reconnect
JmsActivationSpec@...(destination=queue/myqueue ...)
javax.naming.NameNotFoundException: myqueue not bound
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/myqueue")
})
public class MyMDB implements MessageListener {
public void onMessage(Message msg) { /* 處理邏輯 */ }
}
關鍵點:destination=queue/myqueue 對應 JNDI 名稱 queue/myqueue。JBoss 不會自動創建 此 Queue,必須通過配置文件定義 MBean 綁定。
文件:JBOSS_HOME/server/default/deploy/mail-service.xml (或任意 deploy 目錄下的 *-service.xml)
<?xml version="1.0" encoding="UTF-8"?>
<server>
<mbean code="org.jboss.mq.server.jmx.Queue"
name="jboss.org.destination:server=Queue,name=myqueue">
<attribute name="JNDIName">queue/myqueue</attribute>
<depends optional-attribute-name="DestinationManager">
jboss.mq:service=DestinationManager
</depends>
</mbean>
</server>
說明:name 屬性為 JMX ObjectName,JNDIName 屬性對應 MDB 的 destination 值。depends 確保 DestinationManager 先啟動。
文件:JBOSS_HOME/server/default/deploy/MDB-service.xml (文件名任意,必須以 -service.xml 結尾)
<?xml version="1.0" encoding="UTF-8"?>
<server>
<mbean code="org.jboss.mq.server.jmx.Queue"
name="jboss.mq.destination:service=Queue,name=myqueue">
<depends optional-attribute-name="DestinationManager">
jboss.mq:service=DestinationManager
</depends>
</mbean>
</server>
優勢:不侵入 JBoss 原配置,隨應用遷移,支持多 Queue 集中管理,可放入 deploy 任意子目錄。
Bound queue 'queue/myqueue' to JNDI 類似日志。onMessage 正常觸發。standalone-full.xml 中 <subsystem xmlns="urn:jboss:domain:messaging:...> 定義 <jms-queue name="myqueue" entries="queue/myqueue java:jboss/exported/queue/myqueue"/>。MDB @ActivationConfigProperty(destination="queue/myqueue") 只是聲明意圖,**JBoss 需顯式 MBean 配置將 Queue 綁定到 JNDI**。兩種 *-service.xml 方式任選一即可,推薦獨立文件利於維護。理解「聲明 ≠ 創建」是 JBoss JMS 開發的關鍵認知。