2012-01-16 129 views
0

基本上我想使用一个jsp网页,所以在Java中,运行(管理器)不同的后台进程(可以是任何运行的)在Linux服务器上。在java web服务器上运行单独的后台进程

它们需要以不同的用户身份运行,而不是网络本身。

我想知道我有什么选择?

非常感谢。


我刚发现 “运行时RT =调用Runtime.getRuntime();过程PROC = rt.exec(” linux命令 “);”可能有效。

但是我不知道刚刚开始的(child?)进程是否会完全从java servlet进程中分离出来?有可能在不同的帐户下运行它吗?

+0

什么是JEE版本?在JEE 6中,创建异步服务非常容易,使用EJB JEE 5您可以尝试使用消息驱动bean。 – Thomas 2012-01-16 13:18:34

+0

Thx Thomas。我不明白的是如何从一个Java世界的不同帐户下启动一个完全独立的本地进程? – GaryX 2012-01-16 13:22:13

+0

您可能需要http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html。我不认为你可以在JSP页面上做很多事情,你至少需要一个servlet,但即使这样也会存在安全限制。 – Viruzzo 2012-01-16 13:22:44

回答

0

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

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

其次,您只是不希望在Java EE Web应用程序中产生非托管进程/线程。如果进程/线程暂停和/或永远运行,可能导致无法在必要时关闭/重新启动Java EE Web应用程序(您需要首先完全终止它),该怎么办?如果该进程崩溃并将整个Java EE运行时间一起取下,该怎么办?

最后,您不能更改运行该进程的用户。它将始终是执行当前正在运行的Java运行时的用户。

你已经基本上2种选择:

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

  2. 用100%Java做。使用纯Java执行相同的目标,而不需要产生一个进程。您可以根据需要使用ExecutorService API或第三方库(如Quartz)管理后台作业。请注意,即使这些作业仍需运行100%纯Java代码。

相关问题