关于ProcessBuilder的实现设计

时间:2012-09-17 11:32:41

标签: java shell runtime.exec processbuilder

我想做以下事情:

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

为了运行shell命令,我已阅读有关ProcessBuilder和Runtime.exec()的信息。

如何实现上述功能。负责的webapp(struts)将托管在Jbossas 7.1中。

我是否需要一些像JCA,因为不建议使用i.o和EJB(尽管在我的情况下只使用一台服务器)。我可以简单地使用POJO(Struts动作)我不知道如何处理多个线程,虽然Struts动作是“线程安全的”。

提前致谢,

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

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

  • 使用try/finally在使用后删除文件
  • 由于File.deleteOnExit与长时间运行的服务器无关,因此您必须实施常规作业以清除意外故障后留下的临时文件
  • 计时器看门狗应该杀死脚本进程而不是延迟没有回答,有些可能因任何原因而被卡住

顺便说一下,为了避免临时文件的麻烦并提高性能,如果您的代码在Unix系统上运行,我建议您使用stdin/stdout在进程之间传递请求和响应,并将脚本设计为较少的文件尽可能访问。

但是你的系统可能会提出一些限制:除了等待进程返回的JBoss线程之外,创建新进程所需的资源和脚本的处理时间可能导致生成在操作系统中的数千个进程(所以更少可用于处理短Web请求的线程)。为了避免崩溃,看门狗应该在任何时刻限制创建的进程数 - 并且必须通过基准来定义该阈值。