Я создал запланированную задачу, которая выполняет вызов внешнего .jar, который создает несколько файлов xml, я хочу, чтобы это запускалось каждые 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
и это тот, который должен запускаться только по одному экземпляру за раз. каждый раз, когда этот runnable запускается, он вызывает летучую мышь, и JVM создает новый экземпляр.
Я попытался создать экземпляр процесса вне исполнителя и сделать что-то вроде этого
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");
}
}
но кажется, что вы можете внести в runnable только конечные переменные, так что это невозможно. Конечно, я пытался изучить все, что мог об этом, но если вы можете хотя бы указать мне правильное направление, где искать, я был бы очень признателен!




Из 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, не будет перекрывающихся исполнений вашего процесса.
Я только что проверил это, и, похоже, это решение этой проблемы. Большое спасибо!
Я также обнаружил, что некоторые люди привязывают экземпляр приложения к ServerSocket, чтобы добиться чего-то похожего на то, что я пытаюсь сделать, но я не уверен, что это безопасный подход, какие-либо рекомендации?