我想问从 java servlet 运行长进程的最佳方法是什么。我有一个 webapp,当客户端发出请求时,它运行一个 servlet。这个 servlet 应该从请求中获取一些参数,然后运行一个进程。这个过程可能需要很长时间,所以我需要单独运行它。当这个过程执行完成时,它会发送一封包含结果的电子邮件。
提前致谢。
使用线程池。每次收到请求,创建一个任务并提交到线程池。这将确保过多的请求不会使服务器陷入瘫痪,因为您可以控制可以拥有多少并发线程,以及可以在线程池的等待任务队列中等待多少任务。
请参阅Executors和ThreadPoolExecutor的 javadoc 。
我看到了两种可能性:
WebSphere MQ
第二种方法有优势:如果应用程序由于某种原因现在无法处理请求,应用程序可以稍后返回
虽然这听起来有点危险,调用 servlet 会产生一个进程(没有适当的节流功能),但您可以使用Runtime.getRuntime().exec()
. 更好的是用来ProcessBuilder
准备过程参数并产生它。
通常,这种活动被委托给另一种类型的应用程序模块,例如消息驱动 bean,这对我来说似乎是最干净且符合标准的解决方案。尽管如果您创建自己的线程(标准禁止但很少强制执行)大多数服务器不会抱怨,但在我看来,设置您自己的作业队列和池执行环境所需的管理量并不值得。