2009-01-17 74 views
6

我試圖創建使用JNDI簡單地與ActiveMQ連接。 通過JNDI使用ActiveMQ


  1. 名爲 'example.A' 隊列。

  2. 根據ActiveMQ documentation touching JNDI,如果我想通過JNDI使用ConectionFactories和Queues(Topics),我必須將jndi.properties文件放在我的類路徑中。據我所知,activeMQ類路徑默認是%activemq%/ conf目錄。我沒有改變它。 所以我有這個屬性對我的隊列:

    queue.MyQueue = example.A

  3. 我已經創建了ActiveMQ的Java客戶端類,使用如下JNDI:

    Properties jndiParameters = new Properties() ; 
        jndiParameters.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory"); 
        jndiParameters.put(Context.PROVIDER_URL, "tcp://localhost:61616"); 
        Context context = new InitialContext(jndiParameters); 
        ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("ConnectionFactory"); 
        Queue queue = (Queue) context.lookup("MyQueue"); 
    

但它找不到我的隊列,它會拋出異常:javax.naming.NameNotFoundException:MyQueue

我的錯誤在哪裏?

+0

我有一個類似的問題,我可以配置jndi url和連接工廠,但我無法提供其他屬性。這樣看起來Queue端點沒有被定義。如果我使用dynamicQueue/Test,它可以工作,但是是否也可以處理靜態命名的目標? – eckes 2017-02-16 18:25:46

回答

5

問題是您正在顯式創建屬性並將它們傳遞給InitialContext構造函數。這意味着類路徑上的jndi.properties不會被讀取。

你的代碼應該是這樣的:

Context context = new InitialContext(); 
ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("ConnectionFactory"); 
Queue queue = (Queue) context.lookup("MyQueue"); 
1

您可以設置靜態屬性以及從文件本身檢索它們:

InputStream is = getClass().getResourceAsStream("/my.jndi.properties"); 
    Properties jndiParameters = new Properties(); 
    jndiParameters.load(is); 
    jndiParameters.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory"); 
    jndiParameters.put(Context.PROVIDER_URL, "tcp://localhost:61616"); 
    Context ctx = new InitialContext(jndiParameters); 
... 

這個工作,只要你設置靜態道具加載完資源後。例如,如果您正在從其他地方加載提供者網址,這會很有幫助。