在java web服务器上运行单独的后台进程

时间:2012-01-16 13:16:36

标签: java jsp java-ee

基本上我想使用jsp网页,所以在Java中,在linux服务器上运行(管理)不同的后台进程(可能是运行的任何东西)。

他们需要以与网络本身不同的用户身份运行。

我想知道我有哪些选择?


我刚发现

Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("linux command");

可能会奏效。

但我不知道刚启动的(child?)进程是否会完全脱离java servlet进程?是否有可能在不同的帐户下运行它?

1 个答案:

答案 0 :(得分:0)

在所谓的终身运行的Java EE Web应用程序中使用Runtime是一个坏主意。

首先,Runtime创建的新进程将按设计分配与当前运行的Java环境一样多的新堆内存。这可能不一定会损坏一个简单的Java应用程序,它默认使用64MB或者其他东西,但是在通常以千兆字节为单位分配内存的Java EE Web应用程序中,这将是一个完全的内存浪费。

其次,您只是不希望在Java EE Web应用程序中生成非托管进程/线程。如果进程/线程停止和/或永远运行会导致无法在必要时关闭/重启Java EE Web应用程序(首先需要完全删除它),该怎么办?如果进程崩溃并沿着它删除整个Java EE运行时该怎么办?

最后,您无法更改运行该流程的用户。它将始终是执行当前运行的Java运行时的同一用户。

你基本上有两个选择:

  1. 根本不要使用Java。例如,只需使用平台提供的后台作业管理器来完成工作,例如基于Unix的平台中的Cron和基于Windows的平台中的任务计划程序。

  2. 在100%Java中完成。使用纯Java执行相同的目标,而无需生成进程。如有必要,您可以使用ExecutorService API或Quartz等第三方库来管理后台作业。请注意,即使这些作业仍然需要运行100%纯Java代码。