这类似于 How do I allow only 1 named Semaphore to be created on a server?但我在这里问的是 Java。
我想在我的 Java 应用程序中创建一个信号量,如果应用程序的另一个实例正在运行并且已经创建了信号量,则创建将失败(有一个明显的异常(exception))。所以每台服务器只有一个。
我希望在整个服务器上只保留一个,而不仅仅是 JVM。但我不希望它跨多个服务器(或虚拟机)。即我希望该应用程序能够在 2 个不同的服务器上运行。
这可能吗?如果是,怎么办?
最佳答案
你可以在/tmp
目录下写一个mywebapp.lock
文件,检查这个文件是否存在。
这是您可以使用的一些代码之王(未经测试):
假设 applicationFileLock
是一个 FileLock
,它将在应用程序执行期间持有锁。您可以在应用程序启动期间执行以下代码:
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()
释放锁。
关于java - 如何只允许在服务器上创建 1 个 Java 信号量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16990241/