【问题标题】:Avoid scheduled executor from creating several instances of a java process避免调度执行器创建多个 java 进程实例
【发布时间】:2019-02-25 01:36:59
【问题描述】:

我创建了一个 scheduleTask,它执行对创建一些 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

这是一次只能运行一个实例的实例。 每次运行此可运行对象时,它都会调用 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");


        }
}

但似乎您只能将最终变量带入可运行对象,因此这是不可能的。 当然,我尽我所能对此进行了研究,但如果您至少可以为我指出正确的方向,我将不胜感激!

【问题讨论】:

  • 我还发现有些人将应用实例绑定到 ServerSocket 以实现类似于我正在尝试的东西,但不确定这是否是一种安全的方法,有什么建议吗?

标签: java process exec runnable scheduledexecutorservice


【解决方案1】:

来自 Javadoc

如果执行了这个任务 * 比它的时间更长,然后是后续的执行 * 可能开始较晚,但不会同时执行。

所以你只需要等待进程在你的可运行文件中完成,如下所示:

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

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

【讨论】:

  • 我刚刚检查了一下,这似乎是解决这个问题的方法。非常感谢!
猜你喜欢
  • 2018-03-10
  • 2015-08-28
  • 2022-01-09
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
相关资源
最近更新 更多