Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
避免计划执行器创建java进程的多个实例_Java_Process_Exec_Runnable_Scheduledexecutorservice - Fatal编程技术网

避免计划执行器创建java进程的多个实例

避免计划执行器创建java进程的多个实例,java,process,exec,runnable,scheduledexecutorservice,Java,Process,Exec,Runnable,Scheduledexecutorservice,我创建了一个scheduledTask,它执行对创建一些xml文件的外部.jar的调用,我希望每4分钟运行一次。 每次运行external.jar时,都会创建它的一个新实例,但我希望它关闭现有实例,并创建一个新实例 基本上这是我的代码: private static void RunInvoiceProcesses(Properties props) { ScheduledExecutorService executorService = Executors.newScheduledThre

我创建了一个scheduledTask,它执行对创建一些xml文件的外部.jar的调用,我希望每4分钟运行一次。 每次运行external.jar时,都会创建它的一个新实例,但我希望它关闭现有实例,并创建一个新实例

基本上这是我的代码:

private static void RunInvoiceProcesses(Properties props) {
ScheduledExecutorService executorService =  
Executors.newScheduledThreadPool(executorService.scheduleAtFixedRate(new 
Runnable() {
        @Override
        public void run() {

          Runtime.getRuntime().exec("cmd /c call C:\\creinvoice\\XMLGen\\runxmlgen.bat");


        }
},
15,
240,
TimeUnit.SECONDS);
//bat只调用java-jar myapp.jar

这是一个一次只能运行一个实例的实例。 每次运行这个runnable时,它都会调用bat,JVM会创建一个新实例

我尝试在executor之外创建一个Process实例,并执行类似的操作

Process xmlGeneration = null;

  Runnable() {
        @Override
        public void run() {
    if (xmlGeneration.stillAlive()){xmlGeneration.Destroy();}
         xmlGeneration= Runtime.getRuntime().exec("cmd /c call C:\\creinvoice\\XMLGen\\runxmlgen.bat");


        }
}
但似乎只能将最终变量带入可运行状态,所以这是不可能的。 当然,我试着尽我所能研究这个问题,但如果你能至少告诉我该去哪里找,我真的很感激

来自Javadoc

如果此任务的任何执行 *比其周期长,然后执行后续操作 *可以延迟启动,但不会同时执行

所以,您只需等待流程在runnable中完成,并执行以下操作:

Process p =  Runtime.getRuntime().exec(...);
p.waitFor();
在这种情况下,您的
Runnable
将等待底层进程完成,并且由于
ScheduledThreadPool
的工作方式,您的进程将不会重复执行。

来自Javadoc

如果此任务的任何执行 *比其周期长,然后执行后续操作 *可以延迟启动,但不会同时执行

所以,您只需等待流程在runnable中完成,并执行以下操作:

Process p =  Runtime.getRuntime().exec(...);
p.waitFor();

在这种情况下,您的
Runnable
将等待底层进程完成,并且由于
ScheduledThreadPool
的工作方式,您的进程将不会重复执行。

我还发现,有些人将应用程序实例绑定到ServerSocket,以实现类似于我尝试的功能,但是我不确定这是否是一种安全的方法,有什么建议吗?我还发现有些人将应用程序实例绑定到ServerSocket以实现类似于我尝试的功能,但我不确定这是否是一种安全的方法,有什么建议吗?我只是检查了一下,这似乎是解决此问题的/a解决方案。谢谢!我刚刚检查了一下,它似乎是这个问题的/a解决方案。谢谢!