这与How do I allow only 1 named Semaphore to be created on a server?类似,但我在这里要求Java。
我想在我的Java应用程序中创建一个信号量,如果应用程序的另一个实例正在运行并且已经创建了信号量,那么创建将失败(有明显的例外)。所以每个服务器只有一个。
我只想在服务器上保留一个限制,而不仅仅是JVM。但我不希望它跨越多个服务器(或VM)。即我希望该应用程序能够在2个不同的服务器上运行。
这可能吗?如果是这样,怎么样?
答案 0 :(得分:0)
您可以在mywebapp.lock
目录中编写/tmp
文件,并检查该文件是否存在。
这是您可以使用的一些代码之王(未经测试):
假设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()
解除锁定。