7

我想问从 java servlet 运行长进程的最佳方法是什么。我有一个 webapp,当客户端发出请求时,它运行一个 servlet。这个 servlet 应该从请求中获取一些参数,然后运行一个进程。这个过程可能需要很长时间,所以我需要单独运行它。当这个过程执行完成时,它会发送一封包含结果的电子邮件。

提前致谢。

4

4 回答 4

5

使用线程池。每次收到请求,创建一个任务并提交到线程池。这将确保过多的请求不会使服务器陷入瘫痪,因为您可以控制可以拥有多少并发线程,以及可以在线程池的等待任务队列中等待多少任务。

请参阅ExecutorsThreadPoolExecutor的 javadoc 。

于 2013-01-22T12:29:44.100 回答
2

我看到了两种可能性:

  1. 为每个任务创建一个单独的线程(线程池方法)。这是可能的,但可能会产生性能问题。
  2. 创建第二个应用程序。例如,您可以将参数保存到 DB。第二个应用程序将每隔一段时间监视这个数据库并做一些事情。相反,DB,您可以使用一些消息队列管理器,例如WebSphere MQ

第二种方法有优势:如果应用程序由于某种原因现在无法处理请求,应用程序可以稍后返回

于 2013-01-22T12:29:44.767 回答
2

虽然这听起来有点危险,调用 servlet 会产生一个进程(没有适当的节流功能),但您可以使用Runtime.getRuntime().exec(). 更好的是用来ProcessBuilder准备过程参数并产生它。

于 2013-01-22T12:30:13.817 回答
2

通常,这种活动被委托给另一种类型的应用程序模块,例如消息驱动 bean,这对我来说似乎是最干净且符合标准的解决方案。尽管如果您创建自己的线程(标准禁止但很少强制执行)大多数服务器不会抱怨,但在我看来,设置您自己的作业队列和池执行环境所需的管理量并不值得。

于 2013-01-22T12:32:53.513 回答