2009-01-12 54 views
6

我已經通過在activemq.xml(ActiveMQ版本5.2.0)中配置它,如documentation中所述設置隊列。ActiveMQ:問題與隊列查找

<destinations> 
    <queue physicalName="FOO.BAR" /> 
    <queue physicalName="DUMMY" /> 
</destinations> 

我試圖從Java用下面的代碼訪問它(在同一主機上):

Hashtable properties = new Hashtable(); 
properties.put(Context.INITIAL_CONTEXT_FACTORY, 
    "org.apache.activemq.jndi.ActiveMQInitialContextFactory"); 
properties.put(Context.PROVIDER_URL, "tcp://localhost:61616"); 

context = new InitialContext(properties); 

factory = (ConnectionFactory) context.lookup("ConnectionFactory"); 
connection = factory.createConnection(); 
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
queueName = "DUMMY"; // which can be either FOO.BAR or DUMMY 
dest = (Destination) context.lookup(queueName); 

我receveing下面的錯誤,雖然隊列中JConsole的可見( Tree/org.apache.activemq/Queue):

javax.naming.NameNotFoundException: DUMMY 

請告訴我我做錯了什麼。非常感謝!

回答

8

首先你不必explicitly create any queues in the broker雖然它沒有傷害。

此外,代理中可用的目標不會自動奇蹟般地映射到您使用某種JNDI名稱的JNDI上下文中。您可以這樣做explicitly as described here。如果你想JNDI的自動神奇人口然後使用dynamicQueues JNDI命名慣例/假人爲你查找(如Dynamically creating destinations描述)的JNDI名稱

+0

感謝您解釋創建主題/隊列並將其映射到JNDI上下文之間存在差異。我懷疑我們試圖解決的隊列/主題連接問題的根源在於創建== JNDI註冊的假設。 – 2009-11-17 21:11:45

0

嗯..很好,當我要聽隊列我通常做這樣的事情。 (從javax.jms導入)

隊列隊列;

// Connect to ActiveMQ 
    ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(messageBrokerURL); 
    connection = factory.createConnection(); 
    session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 

    // List to Dummy Queue 
    queue = session.createQueue("DUMMY"); 
    messageConsumer = session.createConsumer(queue); 
    messageConsumer.setMessageListener(queueHandler); 

    // Start the connection 
    connection.start(); 

並確保您的處理程序實現MessageListener。

+0

謝謝伯尼。問題在於你具有ActiveMQ特定的代碼,我上面列出的代碼與其他JMS實現(即OpenJms)完美兼容。 – MrG 2009-01-13 08:43:48