2013-02-17 173 views
1

我正在設計一個獨立的應用程序(無應用程序服務器),它將每隔5分鐘調用兩個定時器併發送(根據文件是否存在於導演中)並接收來自隊列的消息。此應用程序計劃連續運行很長時間(幾年)....獨立客戶端中的JMS連接

現在我有一個困境是否只創建一次JMS連接並一直使用它..或連接每個連接5分鐘,並關閉它們...(做業務邏輯後)

任何關於設計的建議將會有幫助嗎?如果我去單一連接(並使用JMS MessageListenr),如果隊列管理器關閉並在一兩天後纔會發生什麼.......

我嘗試了一個ActiveMQ示例...並且只要我殺了積極的MQ代理和製作人......聽者線程(創建conn將只有一次,使用的MessageListener)申請數分鐘

//監聽代碼如下

connectionFactory = new ActiveMQConnectionFactory(
      ActiveMQConnection.DEFAULT_USER, 
      ActiveMQConnection.DEFAULT_PASSWORD, 
      ActiveMQConnection.DEFAULT_BROKER_URL); 
    connection = connectionFactory.createConnection(); 
    connection.start(); 
    session = connection.createSession(transacted, Session.AUTO_ACKNOWLEDGE); 
    destination = session.createQueue("mmy first active mq queue"); 

    MessageConsumer consumer = session.createConsumer(destination); 
    MyListener mylistener = new MyListener(); 
    consumer.setMessageListener(mylistener); 
    connection.setExceptionListener(mylistener); 

回答

0

在後自動結束我的意見單一連接將是一個非常糟糕的選擇嚴重的原因:

  1. 特殊情況下(斷開連接,跌倒等)可能會導致聽衆摔倒(而不是再聽)。

  2. Java的內存消耗可能達到不想要的水平。

  3. 程序總是需要改變,所以使用一個連接工作不那麼動態。

隊列的最大優點是thah它變得可以住,只要我們想要的信息,所以,如果 您的程序可以在非syncronus方式工作,沒有理由對連接布萊恩。

0

在使用一個連接的ActiveMQ中是可能的,並且可以是一個很好的解決方案,但當然這取決於應用程序。 ActiveMQ提供的庫提供了一個連接池機制,可以在您的應用中使用。您不必使用標準的ActiveMQConnectionFactory,而是使用PooledConnectionFactory,並在您的應用程序使用的連接實例的封面下爲您合併。

每次需要連接時,工廠都可以從池中返回一個未使用的連接,並且每個連接都可以有一組會話也集中在其中,從而進一步降低分配量和連線級別的振鈴,以啓動連接和會話。

關於這個問題,你可以探索一些有趣的博客。

Pooled Connections in ActiveMQ Using ActiveMQ with Spring

另一個地方尋找代碼樣本是在ActiveMQ的源本身的模塊有幾個單元測試,顯示在行動池中。

0

對於任何消息傳遞系統,您總是會面臨一個要求,讓程序在某個時間點連接重試,以便提出警報。例如,如果您的QMgr實際上已關閉一兩天,您可能希望應用程序在連接丟失的幾分鐘內記錄該事件,而不是阻止在兩次未發出警告的情況下等待兩天的重新連接嘗試。

考慮到這一要求,首先要做的是設計應用程序以遍歷包括連接嘗試消息傳遞引擎和異常處理的序列。在該循環中,您可以假定存在連接,並維護隊列的句柄或根據需要打開和關閉隊列。在內部循環中驅動輪詢,或者每次迭代乾淨地退出,並根據需要讓外部循環重新驅動連接。

只要外層循環就位,您的應用就可以持續運行,而不管消息傳遞引擎端的連接丟失。 (我使用'消息傳遞引擎'來避免特定於供應商的術語,例如此答覆的通用部分的隊列管理器。)

如果要使用WebSphere MQ,可以執行諸如升級QMgr同時通過使用多實例HA QMgr運行應用程序。該應用將無縫地重新連接到QMgr的運行半部分,無需更改代碼,如果您需要兩階段提交,則可以使用XA。如果重新連接輪詢超過了配置的閾值而未找到活動的QMgr,則應用程序會收到一條錯誤代碼,然後您可以使用該錯誤代碼提醒警報。

最後,應用程序是否應該每5分鐘重新連接的問題對WMQ QMgr本身沒有任何影響。即使您使用TLS通道,QMgr的額外負載也可以忽略不計。主要考慮的是頻道啓動時間,但5分鐘的輪詢並不是一個可能出現的問題。其他交通工具可能會也可能不會有問題,但我沒有資格與他們交談。就WebSphere MQ而言,沒有任何問題。即使是一個小QMgr也可以處理數千個同時連接。重新連接每個輪詢方法的優點是在嘈雜的網絡環境中拋出較少的錯誤。這是因爲簡單地獲得連接並乾淨地退出比在不穩定網絡上保持連續連接更容易。因此,如果應用程序和服務器位於同一個數據中心,則兩個選項都可以使用。如果他們通過WAN連接並受到防火牆超時和其他干擾,則較短的連接往往會更好。