如何限制独立执行且可以通过Web应用程序执行的可运行JAR的执行。

时间:2016-11-19 12:12:24

标签: java spring-mvc jar processbuilder

我有一个可运行的JAR文件,计划使用计时器独立运行。

通过Web应用程序(在Spring MVC中开发)执行相同的JAR。

如果jar通过计时器执行,那么我必须限制JAR的执行,那时不允许通过Web应用程序执行。

注意:[ 我已使用processbuilder执行JAR。 ]

5 个答案:

答案 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");
}

}