跨机器实现这种同步的好设计是什么?

时间:2011-11-04 11:42:51

标签: java process synchronization atomicity

我有两台机器都运行一个进程。机器A上的shell进程将scp到机器B,而B上的java进程将使用这些文件。这两个进程都以crontab任务运行。

如何实现同步/原子性等?如何表示已写入整个文件。

因此B上的进程总是可以访问最新和完整的文件,处理程序不会过时...

3 个答案:

答案 0 :(得分:2)

假设您正在使用具有原子移动的文件系统,那么您可以这样做。或使用符号链接。

A将文件复制到B上的临时位置。上传完成后,它会使用移动或符号链接将文件重定位到预期位置。 B然后才能看到完全上传的文件。

如果您在A上的进程无法通过SSH进入B进行最后一次移动,则可能会添加另一个零字节标记文件,表明上传已完成。

上传FOO.txt,当上传完成后,它会创建FOO.txt.done文件。然后,B扫描目录中的* .done文件,并使用关联的数据文件。当然还要清理。

答案 1 :(得分:0)

通过使用用户控件,在复制文件时(使用来自A的SCP)设置所有权(和适当的chmod'ing),当完成然后更改时,可以解决问题的快速解决/解决方案所有权/权限,以便B上的进程能够访问该文件。

答案 2 :(得分:0)

我猜可以暗示一些黑客攻击。你可以: -

  1. 在文件写入开始时创建临时文件(如锁定文件),其存在意味着正在写入的文件正在写入并在写入完成后删除临时文件。 OR
  2. 删除使用者进程上的crontab并让scp进程发送信号(JMS /单播)。 java进程可以只是队列/套接字上的侦听器,也可以在接收单播时调用。
相关问题