1
我正在尋找一種可靠地從JMS隊列中檢索消息並將它們存儲到平面文件中的方法。通過「可靠」我的意思是,在任何故障(不包括物理磁盤的故障)的情況下,在可能的系統和流程重新推出,我想:JMS消息以可靠的方式存入
- 不丟失任何消息和
- 不在我的文件中有重複的消息。
什麼是實現這一目標的好方法?
上下文:Linux上的WebLogic,每幾小時接收大約3000條消息/秒。
謝謝 - 弗洛裏安。
我正在尋找一種可靠地從JMS隊列中檢索消息並將它們存儲到平面文件中的方法。通過「可靠」我的意思是,在任何故障(不包括物理磁盤的故障)的情況下,在可能的系統和流程重新推出,我想:JMS消息以可靠的方式存入
什麼是實現這一目標的好方法?
上下文:Linux上的WebLogic,每幾小時接收大約3000條消息/秒。
謝謝 - 弗洛裏安。
您將面臨的問題是文件系統; 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之間的分佈式事務,從而不會造成消息丟失或重複。
希望它有幫助
是的,當然問題是文件系統沒有事務處理能力。我需要寫入一個文件,而不是數據庫。 所以我需要以某種方式在文件系統上實現一個交易方案 - 正是我需要的目的。有沒有什麼辦法(一個API來實現?)參與分佈式事務? –
是的,你可以實現自己的XA驅動程序,但這不是微不足道的。另一種選擇是使用輕量級本地數據庫,如支持XA的HSQLDB。您可以根據需要從存儲消息的表中生成文件。 – raffian
啊......另一個想法,只是略有不同:將數據寫入平面文件,並在「提交」時執行:1)將文件刷新到磁盤,並事務性地:2)向XA數據庫寫入文件指針,3) JMS隊列中的更改。通過將文件截斷回到XA數據庫指針所在的位置來完成回滾。你認爲這會起作用嗎? –