我有一个可运行的JAR文件,计划使用计时器独立运行。
通过Web应用程序(在Spring MVC中开发)执行相同的JAR。
如果jar通过计时器执行,那么我必须限制JAR的执行,那时不允许通过Web应用程序执行。
注意:[ 我已使用processbuilder执行JAR。 ]
答案 0 :(得分:1)
我认为你正在开发可授权的jar。 在我的拙见中,对于这种罐子,最好嵌入数据库并在Db中保存执行时间和端口使用,并比较使用时间并限制它。由于系统时间差异或防病毒资源或系统时间分配资源等原因,计时器方法不安全。但是对于监控网络,您可以通过WatchDog应用程序来处理此类问题,
true
答案 1 :(得分:1)
如果我理解正确,您有不同的虚拟机执行相同的jar /代码(我将称之为 operation )。如果是这样,您可以设置一个独立于这些VM的锁定机制。例如,您可以使用文件但更好地使用数据库及其本机锁定功能:创建一个"锁定" (ID,版本,操作,到期)表然后每次操作执行尝试检索操作的锁定行,如果行不存在或已过期则创建/更新锁定行设置到期并允许操作,否则抛出不能执行自锁定的异常。如果操作崩溃,则Expiration用于永远锁定,因为finally
无法执行(例如:OS崩溃)。为了避免双重/并发写入,您应该对Lock表使用DB optimistic locking功能,例如:Version字段。在删除行的操作结束时释放锁定。必须在不同的事务中创建和删除锁定行,与操作(如果有)
答案 2 :(得分:1)
基本上你需要的是一个锁,它适用于jvms。或者,让我们说,一种在jvms之间共享对象的方法,以便您可以锁定它们。这里有多种解决方案,例如创建指示锁的文件,或者如果您的应用程序中已有数据库,则使用基于数据库的锁,或者分发锁。 Terracotta是一种可行的解决方案。您也可以尝试使用apache zookeeper,再次使用来自apache的curator库,使其非常易于使用。
Zookeeper和curator:代码看起来很简单:
import class Utils.TextReader
完整示例:here
答案 3 :(得分:1)
最好的方法是使用数据库。 在应用程序启动时锁定一个特定的行(使用进行更新以确保安全性,以防两者同时启动)并在某些列中写入 in_use 。 然后开始营业,一旦完成从 in_use 到已完成的同一行更新。通过这种方式,在jar的一个实例上的特定时间将执行业务代码。如果它们都在不同的机器中,它也不会失败。
答案 4 :(得分:1)
您可以检查文件是否存在,以便发出.jar正在执行的信号,如果是,则终止:
svg
}
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
if (FileLock.exists()){
System.out.println("The file exists so the jar is running");
System.exit(0);
}
FileLock.createLockFile();
//start Running the .Jar File
/*
*
*
* CODE
*
*
*
*/
//Delete the file when the program terminates
FileLock.deleteLockFile();
System.out.println("Program exiting normally");
}
}