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