2

我想做以下事情:

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

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

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

我需要像 JCA 这样的东西吗,因为不推荐使用 io 和 EJB(尽管在我的情况下只使用一台服务器)。我可以简单地使用 POJO(Struts 动作)吗?我不确定如何处理多个线程,尽管 Struts 动作是“线程安全的”。

提前致谢,

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

4

2 回答 2

2

You should take a look at the Apache Camel framework: http: //camel.apache.org/index.html. It is a very useful and easy to learn/use integration framework. It has all the components that you need:

I used it in a Java EE environment in one project (JBoss AS 7.1 + JSF2/Richfaces) and like it very much.

于 2012-09-26T13:40:52.233 回答
1

我确认没有必要为 JCA 和 EJB 烦恼,因为在这种情况下两阶段提交事务传播听起来并不相关,而且绝对难以实现。

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

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

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

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

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

于 2012-09-24T20:42:51.383 回答