Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Javaservlet运行长流程的最佳方法是什么?_Java_Servlets_Process - Fatal编程技术网

从Javaservlet运行长流程的最佳方法是什么?

从Javaservlet运行长流程的最佳方法是什么?,java,servlets,process,Java,Servlets,Process,我想问一下,从Javaservlet运行长流程的最佳方法是什么。我有一个webapp,当客户端执行请求时,它会运行一个servlet。这个servlet应该从请求中获取一些参数,然后运行一个进程。这个过程可能需要很长时间,所以我需要单独运行它。当这个过程执行完毕后,它会发送一封包含结果的电子邮件 提前感谢。使用线程池。每次收到请求时,创建一个任务并将其提交到线程池。这将确保过多的请求不会使服务器崩溃,因为您可以控制可以拥有多少并发线程,以及线程池中等待任务的队列中可以等待多少任务 请参阅java

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


提前感谢。

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


请参阅javadoc以了解和。

我认为有两种方法可以做到这一点:

  • 为每个任务创建一个单独的线程(线程池方法)。这是可能的,但可能会造成性能问题
  • 创建第二个应用程序。例如,您可以将参数保存到数据库。第二个应用程序将每隔一段时间监视这个数据库并执行一些操作。相反,您可以使用一些消息队列管理器,如
    webspheremq

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

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

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