2011-05-18 64 views
2

我有兩個我想完全分離的java進程。2 java進程 - 一次讀取和一次寫入同一個文件

我認爲最好的方法是將其數據寫出到文件中,另一個從該文件中讀取數據(第二種可能還必須寫入文件以說明其處理該行) 。

我設想的問題是對文件進行同類訪問。有一個很好的簡單模式可以用來解決這個問題嗎?有沒有一個庫可以處理這種功能?

最好的方式來描述它是一個簡單的直接消息傳遞機制,我可以使用文件來實現。 (比JMS簡單)。

謝謝丹

+0

爲什麼不直接使用套接字和ObjectInputStream/ObjectOutputStream? – 2011-05-18 12:22:34

+0

因爲我希望它們完全分離 - 所以它們可能不會同時運行。 – Dan 2011-05-18 12:23:18

回答

1

如果你想要一個簡單的解決方案,你可以假設「重命名文件」是一個原子操作(這不完全正確),每一個進程可以在讀取文件或寫入文件時對其進行重命名,並在完成時將其重命名。另一個將不會找到該文件,並會等待文件出現。

0

你的意思是像一個命名的管道?這是可能的,但Java不允許管道創建,除非你使用非便攜式進程

+0

否 - 更像是使用我可以使用文件實現的簡單形式的JMS。 – Dan 2011-05-18 12:26:32

0

如果你沒有鎖定基於文件的解決方案,數據庫可以解決你的問題。
每條記錄​​都是由寫入過程寫成的一行。記錄中的單個列將不變,讀取過程將使用它來指示它記錄的紅色。

當然,您必須在清理表格之前對其進行清理,或者對其進行分區,以便讀取過程可以輕鬆地在其中查找信息。

如果您必須使用一個文件 - 您可以考慮另一個文件,該文件只有讀取器進程讀取的記錄的ID - 這樣您就不需要在同一文件上同時寫入進程。

0

您正在要求的功能與JMS的功能完全相同。 JMS是一個有很多實現的API。你可不只是使用輕量級的實現?我不明白你爲什麼認爲這是「複雜」。等到你們可以可靠地實施你的解決方案時,你會發現處理所有邊緣案例並不是微不足道的。

+0

我不得不建立幾個這樣的解決方案,並總是在(S)FTP文件和使用消息隊列之間進行選擇。一方面,如果我手工製作東西,我會支持它。另一方面,對於如此簡單的任務來說,消息隊列似乎是一種矯枉過正的行爲。另一個考慮因素是數據量。例如,我們注意到FuseMQ的性能在隊列大小達到1M消息後顯着下降,這些消息的大小相對無關緊要。 – Olaf 2011-05-18 13:36:26

+0

隨着音量的增加,大部分東西都會降解(或完全填滿),無論你寫什麼,無疑都會在某處發生瓶塞。如果你想要的行爲幾乎完全是消息隊列的消息隊列,那麼消息隊列並不過分......你似乎準確地描述了消息隊列的要求:-) – djna 2011-05-18 15:59:29

+0

也許你是對的。我只是想盡量挑逗他們的持久性框架卡哈了。但是依賴關係似乎出錯了:Kaha知道它依然存在MQ消息,而不僅僅是字節塊。 – Olaf 2011-05-18 16:07:10

0

糾正我,如果我不明白你的問題......

你爲什麼不看文件鎖?當一個程序獲得鎖定時,另一個等待,直到鎖定被釋放

+0

如何在2個JVM之間共享鎖定。如果你的意思是一個文件鎖 - 這太複雜了。 – Dan 2011-05-19 10:23:41