2013-10-24 18 views
1

我正在尋找一種可靠地從JMS隊列中檢索消息並將它們存儲到平面文件中的方法。通過「可靠」我的意思是,在任何故障(不包括物理磁盤的故障)的情況下,在可能的系統和流程重新推出,我想:JMS消息以可靠的方式存入

  1. 不丟失任何消息和
  2. 不在我的文件中有重複的消息。

什麼是實現這一目標的好方法?

上下文:Linux上的WebLogic,每幾小時接收大約3000條消息/秒。

謝謝 - 弗洛裏安。

回答

0

您將面臨的問題是文件系統; JMS支持JTA,但文件系統不支持。考慮以下幾點:

public void onMessage(Message message){ 
    try{ 
    TextMessage msg = (TextMessage)message; 
    fileOutput.write(msg.getText()); 
    fileOutput.flush(); 

    }catch(Exception e){ 
    e.printStackTrace(); 
    throw e; 
    } 
} 

假設AUTO_ACKNOWLEDGE,每個消息接收,序列化到文件將成功後的回報onMessage()自動確認。但是,JMS服務器可能會在收到確認之前崩潰,但在將消息寫入文件之後;所以你會得到一個副本。

而不是寫入文件,你有沒有考慮保存到數據庫,最好是有一個XA驅動程序?如果是這樣,您可以使用JMS和RDBMS之間的分佈式事務,從而不會造成消息丟失或重複。

希望它有幫助

+0

是的,當然問題是文件系統沒有事務處理能力。我需要寫入一個文件,而不是數據庫。 所以我需要以某種方式在文件系統上實現一個交易方案 - 正是我需要的目的。有沒有什麼辦法(一個API來實現?)參與分佈式事務? –

+0

是的,你可以實現自己的XA驅動程序,但這不是微不足道的。另一種選擇是使用輕量級本地數據庫,如支持XA的HSQLDB。您可以根據需要從存儲消息的表中生成文件。 – raffian

+0

啊......另一個想法,只是略有不同:將數據寫入平面文件,並在「提交」時執行:1)將文件刷新到磁盤,並事務性地:2)向XA數據庫寫入文件指針,3) JMS隊列中的更改。通過將文件截斷回到XA數據庫指針所在的位置來完成回滾。你認爲這會起作用嗎? –