Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于通过webapp运行ProcessBuilder的一些问题_Java_Multithreading_Spring_Thread Safety - Fatal编程技术网

Java 关于通过webapp运行ProcessBuilder的一些问题

Java 关于通过webapp运行ProcessBuilder的一些问题,java,multithreading,spring,thread-safety,Java,Multithreading,Spring,Thread Safety,我正在编写一个webapp,它基本上允许用户使用通过各种形式输入的参数启动shell脚本。在做了一些研究之后,我相信ProcessBuilder是运行shell脚本的最佳方式,但是我有一些需要满足的条件,希望其他人能告诉我我的想法是否正确 将要启动的脚本实际上需要几个小时才能运行。所以很明显,我不能让应用程序暂停并等待那么长时间。所以我想知道线程是否是这个问题的答案?我对使用线程和寻求建议不是很有经验。我是否应该在新线程中启动ProcessBuilder,以便主web应用程序继续运行?这行得通吗

我正在编写一个webapp,它基本上允许用户使用通过各种形式输入的参数启动shell脚本。在做了一些研究之后,我相信ProcessBuilder是运行shell脚本的最佳方式,但是我有一些需要满足的条件,希望其他人能告诉我我的想法是否正确

将要启动的脚本实际上需要几个小时才能运行。所以很明显,我不能让应用程序暂停并等待那么长时间。所以我想知道线程是否是这个问题的答案?我对使用线程和寻求建议不是很有经验。我是否应该在新线程中启动ProcessBuilder,以便主web应用程序继续运行?这行得通吗?它是否简单到只声明一个新线程并将process builder分配给它?我是否需要担心运行或创建各种线程?只是不确定要注意什么或要注意哪些陷阱

另外,我真的需要一种方法,至少能够在进程运行后检查它的状态。需求需要某种方式来显示流程的进展程度,但我不知道这是可能的。我认为,至少能够表明它仍在运行应该是可以接受的。我该怎么去发现呢


关于更多信息,这是一个Java/SpringWeb应用程序,将运行在某种风格的Unix上。感谢您的想法和帮助。

您可以实现类似于
作业管理器
作业
的功能

作业
可以是一个
可运行的
,它具有一个
ProcessBuilder
。在它的
run
方法中,它启动进程(
ProcessBuilder.start
),等待它退出,并在完成时调用
JobManager
,可能返回进程的退出状态

作业管理器
创建
作业
(每个作业位于新的
线程
),维护当前作业的集合(可能是最近完成的作业的集合,可能是失败作业的列表)。客户端可以给JobManager作业以执行,并查询所有作业或特定作业的状态(运行、完成、失败)

关于进程的状态,作业可以有startTime、endTime和exitStatus变量以及相关的get方法。您可以将它们返回给客户端以显示作业状态表

您的
作业.run
方法可能如下所示

public void run() {
  startTime = System.currentTimeMillis();  
  process = processBuilder.start();

  // spawn threads to consume process output streams
  // even if you're not going to read them

  while (running) {
    try {
      process.waitFor();
      running = false;
    } catch (InterruptedException e) {
      // you could stop a process by interrupting it's Job thread
      process.destroy();
    }
  }
  exitStatus = process.exitValue();
  endTime = System.currentTimeMillis();
  jobManager.onExit(this);
}
关于“%complete”,这只有在你有办法测量它的情况下才有可能

如果一项任务应该在一定时间内完成,你可以用它作为报告预期完成时间/完成百分比的粗略方法


或者,您可以捕获流程的输出,使用它在作业中设置percentComplete变量。例如,当您在输出中看到“消息X”时,将percentComplete设置为25%。这将意味着实现每种脚本类型的自定义代码-可能是一个作业子类,或者给作业一个负责解析输出的成员变量。

非常聪明的想法,非常感谢您的输入。我肯定要多读一些关于线程的东西,但这似乎是处理我想要的事情的最聪明的方法。JobManager只是一个名字,还是一个我可以在某处看到的实际类?还有其他的想法吗?我想找一些类似的例子,JobManager只是一个名字。谷歌的“java进程管理”或类似的将是有用的。也许Apache Commons Exec[能帮上忙吗?我自己还没用过。再次非常感谢。我将对此进行研究,并开始更多阅读,希望我能找到一个可行的解决方案。您的回答肯定会让我更加专注。