Java ProcessBuilder的实现设计

Java ProcessBuilder的实现设计,java,shell,runtime.exec,processbuilder,Java,Shell,Runtime.exec,Processbuilder,我想做以下工作: 将文件写入磁盘。然后运行shell命令。shell命令读取/处理此文件,通过网络发送请求,将响应写入另一个文件,并返回和退出值 为了运行shell命令,我阅读了有关ProcessBuilder和Runtime.exec()的内容 具体如何实现上述功能。负责的webapp(struts)将托管在JBossas7.1中 我是否需要一些类似JCA的工具,因为不推荐使用i.o和EJB(尽管在我的示例中只使用一台服务器)。我可以简单地使用POJO(Struts操作)吗?我不知道如何处理多

我想做以下工作:

将文件写入磁盘。然后运行shell命令。shell命令读取/处理此文件,通过网络发送请求,将响应写入另一个文件,并返回和退出值

为了运行shell命令,我阅读了有关ProcessBuilder和Runtime.exec()的内容

具体如何实现上述功能。负责的webapp(struts)将托管在JBossas7.1中

我是否需要一些类似JCA的工具,因为不推荐使用i.o和EJB(尽管在我的示例中只使用一台服务器)。我可以简单地使用POJO(Struts操作)吗?我不知道如何处理多个线程,尽管Struts操作是“线程安全的”

提前感谢,


如果我使用线程池来并行处理多个请求,这就是使用JCA的原因。

我确认,没有必要使用JCA和EJB,因为在这样的上下文中,两阶段提交事务传播听起来不相关,而且很难实现

我建议您使用
File.createTempFile
在Java中创建请求和响应(第一个为空)文件,以避免线程之间的文件名冲突,并使用
ProcessBuilder
调用shell脚本

从技术上讲,这种实现最困难的一点是释放资源的错误处理:临时文件、卡住的进程:

  • 使用
    try/finally
    在使用后删除文件
  • 由于
    File.deleteOnExit
    与长时间运行的服务器无关,因此必须执行常规作业来清理意外故障后留下的临时文件
  • 计时器看门狗应该杀死没有响应延迟的脚本进程,有些进程可能会因为任何原因被卡住
顺便说一句,为了避免临时文件出现问题并提高性能,如果代码在Unix系统上运行,我建议您使用
stdin/stdout
在进程之间传递请求和响应,并将脚本设计为尽可能少的文件访问


但您的系统可能会有一些限制:创建新进程所需的资源和脚本的处理时间可能会导致操作系统中存在数千个进程,此外还有等待进程返回的JBoss线程(因此可用于处理短web请求的线程更少)。为了避免崩溃,看门狗应该限制任何时候创建的进程的数量,并且必须通过基准来定义阈值。

您应该看看Apache Camel框架:http://Camel.Apache.org/index.html。 它是一个非常有用且易于学习/使用的集成框架。它具有您需要的所有组件:

  • 文件--生成/使用文件,以及创建文件等通知
  • Exec——执行系统命令
  • 并行处理—http://camel.apache.org/Parallel-Processing-and-ordering.html—您可以处理多个请求

我在一个项目(JBoss AS 7.1+JSF2/Richfaces)的Java EE环境中使用了它,我非常喜欢它。

用Java重新创建创建网络请求的功能有多困难?如果你可以这样做,那么你就需要在磁盘上创建文件,或者它们只是帮助创建网络请求吗?很难,因为它与需要付费的计费/税务表单有关,这不是因为它的计费/税单形式是一个令人信服的理由来重写它,因为我将考虑一个基于HTTP请求集成的解决方案。Java和shell调用有点脆弱。另外,如果同时接到20个电话,会发生什么情况。shell脚本可以同时运行吗?是否存在用户输入被恶意注入shell脚本的风险?抱歉,我没有注意到您的问题。如果你仍然感兴趣,我想我可以和你分享这段代码的一些部分。是的,那太好了