避免计划执行程序创建 java 进程的多个实例
Avoid scheduled executor from creating several instances of a java process
我创建了一个 scheduledTask,它执行对创建一些 xml 文件的外部 .jar 的调用,我希望它每 4 分钟 运行 一次。
每次外部 .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
那一次应该只 运行 一个实例。
每次此 运行nable 为 运行 时,它都会调用 bat 并由 JVM 创建一个新实例。
我尝试在执行程序外部创建一个 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");
}
}
但似乎只能将final变量带入运行nable,所以这是不可能的。
当然,我已尽我所能对此进行研究,但如果你至少能为我指出正确的方向,我将非常感激!
来自 Javadoc
If any execution of this task
* takes longer than its period, then subsequent executions
* may start late, but will not concurrently execute.
所以你只需要等待进程在你的 runnable 中完成,像这样:
Process p = Runtime.getRuntime().exec(...);
p.waitFor();
在这种情况下,您的 Runnable
将等待基础流程完成,并且由于 ScheduledThreadPool
的工作方式,您的流程将不会重叠执行。
我创建了一个 scheduledTask,它执行对创建一些 xml 文件的外部 .jar 的调用,我希望它每 4 分钟 运行 一次。 每次外部 .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
那一次应该只 运行 一个实例。 每次此 运行nable 为 运行 时,它都会调用 bat 并由 JVM 创建一个新实例。
我尝试在执行程序外部创建一个 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");
}
}
但似乎只能将final变量带入运行nable,所以这是不可能的。 当然,我已尽我所能对此进行研究,但如果你至少能为我指出正确的方向,我将非常感激!
来自 Javadoc
If any execution of this task * takes longer than its period, then subsequent executions * may start late, but will not concurrently execute.
所以你只需要等待进程在你的 runnable 中完成,像这样:
Process p = Runtime.getRuntime().exec(...);
p.waitFor();
在这种情况下,您的 Runnable
将等待基础流程完成,并且由于 ScheduledThreadPool
的工作方式,您的流程将不会重叠执行。