【问题标题】:What is the best approach to run a long process from a java servlet?从 java servlet 运行长进程的最佳方法是什么?
【发布时间】:2013-01-22 12:22:26
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: java servlets process


    【解决方案1】:

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

    请参阅 ExecutorsThreadPoolExecutor 的 javadoc。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          我看到了两种可能性:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-11
            • 1970-01-01
            相关资源
            最近更新 更多