2011-05-18 72 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