2

我正在编写一个 Java 应用程序,它应该(除其他外)生成一个整数序列,从给定的数字开始(例如 900、901、902、903,...... - 900 作为参数给出)。

  1. 当应用程序关闭然后重新启动时,当前序列值应该保持不变。
  2. 当应用程序的多个实例同时运行时,它们应该共享相同的序列(例如,当单独运行时,所有实例生成的序列的并集应该与单个实例生成的序列相同)。
  3. 管理员应该能够关闭应用程序并手动重置当前序列值。
  4. 如果应用程序崩溃,该文件应该始终可供其他实例访问,以便它们可以继续工作。

决定应用程序将使用仅包含当前号码的纯文本文件。当应用程序启动时,它会检查文件是否已经存在,如果不存在,则创建它并将初始编号写入其中。每次应用程序要生成一个新数字时,它应该读取文件中的当前值,将其用作当前序列值,然后增加文件中的数字。

我现在想,如何原子地做这两件事(关于同一应用程序的其他运行实例):

  • 检查文件是否存在,如果不存在,则创建它并在其中写入一个数字
  • 读取文件的当前内容,然后更改它

关于如何以其他方式实现所列目标的建议也值得赞赏。

4

2 回答 2

2

Using a database sequence would be a simple and solid solution but you've decided it will be a file. Then you'll need to manage the distributed synchronization yourself. There are systems offering that, like Terracotta or Hazelcast. I would definitely use one of them instead of implementing a new one based on locking a file. Why not a database?

于 2012-11-22T11:32:19.587 回答
1

我会在客户端写入文件时创建一个锁定文件,并在写入过程完成后立即删除该锁定文件。

当锁定文件存在时,其他客户端将不会读取或写入 db 文件并等待锁定文件被删除 - 允许同时读取。

你的问题:

  1. 关机挂钩
  2. 通过使用锁文件机制来解决
  3. 每个客户端都可以在 db 文件旁边创建一个 ID 文件,当管理员删除该文件时,客户端将关闭。
  4. 取决于:如果关闭挂钩受到尊重,这应该不是问题,但是如果客户端立即被杀死,您就没有任何机会进行清理。

问题:

  • 如果对许多客户端尝试编写 db 文件,则无法确保首先为第一个客户端提供服务。
  • 如果客户端在写入过程中崩溃并且无法清理锁定文件会怎样?
  • What happens if two clients try to create the lock file at the same time? I think this depends on the os filesystem.
于 2012-11-22T10:39:01.430 回答