java - HttpServlet中如何进行大数据处理?

标签 java servlets jakarta-ee

在我的 Java EE 应用程序中,有一个 servlet 来处理大数据过程。此过程对数据库中的所有实体(1300 万条记录)进行索引,并且至少需要 15 分钟才能完成。由于服务器处理时间过长,客户端抛出了TIMEOUT异常。

@WebServlet("/index")
public class IndexServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;
    private Logger logger = Logger.getLogger(this.getClass());

    @EJB
    private AddressSession addressSession;

    protected void service(HttpServletRequest request,
            HttpServletResponse response) {

        try {
            addressSession.index();
        } catch (InterruptedException e) {
            logger.error(e);
        }
    }
}

我的问题是如何处理这种情况?我应该使用异步处理吗?

最佳答案

对于需要很长时间的流程,Web 界面应该只是一个“作业提交”,它立即确认收到请求并将作业排队等待处理。然后,您将这个“本质上”的后端流程与 Web 层分离。

例如,您不使用http线程池来进行后端处理。有单独的Executor用于处理提交的作业。例如,您可以使用以下命令创建执行器:

ExecutorService executorService = Executors.newFixedThreadPool(10);

然后,当收到请求时,您可以像这样提交作业:

executorService.execute(new Runnable() {
    public void run() {
        // processing
    }
});

现在,如果您还想通过某些 Web 界面提供有关您的工作状态的信息,您需要做更多的工作。您可能希望为提交的作业分配一个唯一的 ID,然后将其与回执确认一起返回。

在这种情况下,由于您使用的是 EJB(如果您使用的是 EJB 3.1 或更高版本),因此您不需要自己对执行器进行编程。您可以使用 Asynchronous您的 EJB 方法上的注释以声明方式执行此异步处理。

关于java - HttpServlet中如何进行大数据处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36964755/

相关文章:

java - "[engine] standardhost[localhost]: MAPPING configuration error for request URI"和 "No context configured to process this request"

java - 无法通过 Smack API 使用 openfire 服务器发送/接收消息

java - 如何寻址我的 java 项目中的文件夹?

java - 如何将 antdirset 与 Ear 任务一起使用?

java - 使用多个随机换行创建新字符串

java - 方法中不必要的字符串(重载方法)

JBoss7 上的 MySQL : DriverManager says caller does not have permission to load driver

java - 使用 .html 文件作为 JSP

java - 动态地将 HTML 从 servlet 发送到 JSP

java - 授予对一个 GAE servlet 的公共(public)访问权限,但对所有其他资源使用身份验证?