避免计划执行器创建java进程的多个实例
我创建了一个scheduledTask,它执行对创建一些xml文件的外部.jar的调用,我希望每4分钟运行一次。 每次运行external.jar时,都会创建它的一个新实例,但我希望它关闭现有实例,并创建一个新实例 基本上这是我的代码:避免计划执行器创建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
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解决方案。谢谢!