Избегайте запланированного исполнителя от создания нескольких экземпляров процесса Java - PullRequest
0 голосов
/ 25 февраля 2019

Я создал запланированную задачу, которая выполняет вызов внешнего файла .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, он вызывает 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");


        }
}

но кажется, что вы можете вносить только конечные переменные в runnable, так что это невозможно.Конечно, я пытался изучить все, что мог об этом, но если вы хотя бы сможете указать мне правильное направление, куда бы я смотрел, я был бы очень благодарен!

1 Ответ

0 голосов
/ 25 февраля 2019

Из Javadoc

Если какое-либо выполнение этой задачи * занимает больше времени, чем ее период, последующие выполнения * могут начаться с опозданием, но не будут выполняться одновременно.

Так что вам просто нужно дождаться завершения процесса в вашем исполняемом файле с чем-то вроде этого:

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

В этом случае ваш Runnable будет ждать завершения основного процесса и из-за того, как ScheduledThreadPool работает тамне будет перекрывающихся выполнений вашего процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...