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

JBoss 部署 EJB 消息驅動 Bean (MDB) 報 NameNotFoundException: myqueue not bound 解決方案

     編輯:Java 相關知識

在 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

二、MDB 代碼與關鍵配置

@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 內置 mail-service.xml (快速驗證)

文件: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 先啟動。

四、解決方案二:創建獨立 *-service.xml 文件 (推薦,模塊化)

文件: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 任意子目錄。

五、驗證與注意事項

  1. 保存配置文件,JBoss 熱部署自動識別 (或重啟)。
  2. 控制台應見 Bound queue 'queue/myqueue' to JNDI 類似日志。
  3. 重新部署 MDB,客戶端發送消息,MDB onMessage 正常觸發。
  4. JBoss 7+/WildFly:配置方式完全不同,需在 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 開發的關鍵認知。

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