2

这类似于我如何只允许在服务器上创建 1 个命名信号量?但我在这里问Java。

我想在我的 Java 应用程序中创建一个信号量,如果该应用程序的另一个实例正在运行并且已经创建了信号量,则创建将失败(有一个明显的例外)。所以每台服务器只有一个。

我希望服务器上只能容纳一个,而不仅仅是 JVM。但我不希望它跨越多个服务器(或虚拟机)。即我希望应用程序能够在 2 个不同的服务器上运行。

这可能吗?如果是这样,怎么做?

4

1 回答 1

0

您可以在目录中写入一个mywebapp.lock文件/tmp,并检查该文件是否存在。

这是您可以使用的一些代码之王(未经测试):

假设这applicationFileLockFileLock在应用程序执行期间持有锁的。您可以在应用程序启动期间执行以下代码:

FileOutputStream fos = new FileOutputStream(new File(System.getProperty("java.io.tmpdir"),"mywebapp.lock"));
try {
   applicationFileLock = fos.getChannel().tryLock();
   if (fileLock == null) {
     throw new AlreadyStartedApplicationException("Cannot ...");
   }
} catch (IOException e) {
   // handle or rethrow.
}

确保applicationFileLock.release()在应用程序结束时释放锁。

于 2013-06-07T18:05:25.980 回答