Async Servlet - 首选实现

2024-02-19

最近,在研究异步处理时Servlets,我至少遇到了三种实现方法 使用这种方法的一些功能。

问题是:

  1. 哪一个是最好的?
  2. 也许其中一些方法不推荐?
  3. 也许还有另一种方法比下面提到的所有方法更好?

找到的方法:

  1. Using AsyncContext.start(Runnable).

    这种方法非常简单明了。但是许多服务器在为创建的线程池中执行这样的作业HTTP要求 (更多相关信息在这里http://www.nurkiewicz.com/2012/05/javaxservletservletrequeststartasync.html http://www.nurkiewicz.com/2012/05/javaxservletservletrequeststartasync.html)

  2. 使用在 Servlet 上下文初始化期间创建的自定义线程池

    (示例在这里:http://www.journaldev.com/2008/async-servlet-feature-of-servlet-3 http://www.journaldev.com/2008/async-servlet-feature-of-servlet-3)。 但是我可以在 Servlet 容器中创建自己的线程吗?不推荐(甚至禁止)EJB(前JavaEE7)。 我可以用吗JavaSE执行者还是我应该使用ManagedExecutors from JavaEE7(假设我使用JavaEE7)?

  3. Using EJB and @Asynchronious注解

    (这里的例子:https://github.com/wildfly/quickstart/tree/master/servlet-async/src/main/java/org/jboss/as/quickstarts/servlet/async https://github.com/wildfly/quickstart/tree/master/servlet-async/src/main/java/org/jboss/as/quickstarts/servlet/async)。 但在这里我无法控制执行任务的线程(即应该创建多少线程等)

我很高兴听到您对这个问题的想法以及您的经验AsyncContext.


所有线程都将具有相同的性能,在后端,所有线程都将请求处理线程替换为另一个线程,以便可以服务更多请求。

您将在下面找到一个简单的实现:

@WebServlet(urlPatterns = "/AsyncLongRunningServlet", asyncSupported = true)
public class AsyncLongRunningServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Request Processing Thread "+Thread.currentThread().getName());

        request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);
        response.setContentType("text/html");
        PrintWriter printWriter=response.getWriter();
        printWriter.println("<html><head><title>Asynchronous servlet</title></head><body>");
        printWriter.println("Request Processing Thread "+Thread.currentThread().getName());
        printWriter.println("<br>");
        printWriter.println("<progress id='progress' max='100')></progress>");
        printWriter.println("<br>");

        AsyncContext asyncCtx = request.startAsync();
        asyncCtx.addListener(new AppAsyncListener());
        asyncCtx.setTimeout(12000);
        //release of request processing thread
        asyncCtx.start(() ->{
            printWriter.println("<br>");
            printWriter.println("Async thread Name "+Thread.currentThread().getName());
            printWriter.println("<br>");

            int i=0;
            while(i<100)
            {
                printWriter.println("<script>document.getElementById('progress').value=\""+i+"\";</script>");
                printWriter.flush();
                try {
                    Thread.sleep(100);
                } catch (Exception e) {
                }
                i++;
            }
            printWriter.println("</body></html>");
            asyncCtx.complete();
        }

    );
        printWriter.println("<br>");
        printWriter.println("End of response");
    }

}



package com.journaldev.servlet.async;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.AsyncEvent;
import javax.servlet.AsyncListener;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebListener;

@WebListener
public class AppAsyncListener implements AsyncListener {

    @Override
    public void onComplete(AsyncEvent asyncEvent) throws IOException {
        System.out.println("AppAsyncListener onComplete");
        // we can do resource cleanup activity here
    }

    @Override
    public void onError(AsyncEvent asyncEvent) throws IOException {
        System.out.println("AppAsyncListener onError");
        //we can return error response to client
    }

    @Override
    public void onStartAsync(AsyncEvent asyncEvent) throws IOException {
        System.out.println("AppAsyncListener onStartAsync");
        //we can log the event here
    }

    @Override
    public void onTimeout(AsyncEvent asyncEvent) throws IOException {
        System.out.println("AppAsyncListener onTimeout");
        //we can send appropriate response to client
        ServletResponse response = asyncEvent.getAsyncContext().getResponse();
        PrintWriter out = response.getWriter();
        out.write("TimeOut Error in Processing");
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Async Servlet - 首选实现 的相关文章

随机推荐

  • 计算与谓词匹配的元素数量的惯用方法是什么?

    除了这个之外 是否有更好的方法来计算谓词函数为 true 的元素数量 PredCount lst pred Length Select lst pred 我问这个问题是因为构建一个子集似乎效率低下lst with Select 并且因为Co
  • 将作曲家 1 和 2 保留在同一台机器上

    我们如何在同一台机器上使用 Composer 1 和 Composer 2 作为一名开发人员 我们在同一台机器上处理多个项目 并且项目 1 需要 Composer 1 项目 2 需要 compower 版本 2 这就是我曾经在同一台机器上安
  • 为什么我不能在 MySQL 中使用特定的排序规则?

    我有一个包含字符集的表latin1 通过检查show variables like character set database 和默认排序规则latin1 swedish ci 通过检查SHOW TABLE STATUS 我想使用排序规则
  • 如何部署线程安全的异步 Rails 应用程序?

    我在网上阅读了大量有关不同版本的 Ruby 和 Rails 中的线程安全和性能的材料 我想我现在已经很好地理解了这些内容 奇怪的是 讨论中似乎缺少的是如何实际部署异步 Rails 应用程序 当谈论应用程序中的线程和同步性时 人们想要优化两件
  • 寻找用于在细分域上进行数值积分的 Python 包

    我想知道是否有人知道基于 numpy scipy 的 python 包 可以在镶嵌域 在我的具体情况下 由 voronoi 单元格界定的 2D 域 上对复杂的数值函数进行数值积分 过去 我使用了 matlab 文件交换之外的几个包 但如果可
  • Netbeans 外部控制台错误

    我正在尝试使用 netbeans 在 Windows 10 中 在 C 中编译一个简单的 hello world 程序 但是出现以下错误 sh cygdrive c Users myuser 1 AppData local Temp dli
  • 如何获得随机数,每个数字都有自己的概率[重复]

    这个问题在这里已经有答案了 例如 我想从集合 S 0 1 2 3 中获取随机数 但现在每个数字都有不同的概率 而不是每个数字都有相同的显示概率 即 25 比如说 50 30 20 10 我该如何编码 在 Java 或 C 中 我更喜欢 C
  • 在共享内存中初始化 pthread 互斥体

    我可以使用初始化器初始化静态内存中的互斥体 pthread mutex t mymutex PTHREAD MUTEX INITIALIZER 但是如何在共享内存中初始化一个变量 在该内存中我必须与初始化变量分开分配内存 我可以执行 mem
  • 怎样才能让到处下雨呢?

    我想创建一个下雨效果我的天气应用程序 https thewthr app 仅使用 CSS 然而 尽管我在外观上取得了令人满意的结果 但我似乎无法让它们连续覆盖整个屏幕 而不仅仅是随机的块 我该怎么办 body overflow hidden
  • 获取 Dexie 中的 GroupBy 计数

    我有一个索引数据库下表接受以下结构化 JSON 作为一行 id 1 name doc1 createdDate 2018 08 08 我想计算表中每个可用日期的数量 IE groupby 日期然后计数 预期示例输出的格式为 2018 08
  • 如何区分堆栈 DICOM 图像和概览图像?

    I have a stack of DICOM coronal images where I have used the Image Position Patient 0020 0032 tag to sort the images in
  • PHPUnit 接收系统日志消息吗?

    我正在使用打开日志的方法测试记录器类 如下所示 openlog this gt identifier this gt option this gt facility syslog level message closelog The fac
  • 将库的文档添加到手册页

    我正在使用 Ubuntu 12 04 1 我正在学习使用 C 中的 FFmpeg 库制作一个基本的视频播放器 我的手册页没有显示库的标题 函数的任何条目 有人可以告诉我一种将文档添加到我的手册页的方法吗 这样搜索比每次都在网页上搜索要容易得
  • 如何检查groovy脚本的编译错误[重复]

    这个问题在这里已经有答案了 我们可以使用下面的代码在运行时创建并运行 groovyscript import groovy lang GroovyClassLoader import groovy lang GroovyObject imp
  • 如何将数据传递到 MSBuild 任务的 ITaskItem 属性?

    我有一个自定义任务 我在其中使用MSBuild 效果很好 以前 我有一些属性接受一些string数据 有人建议我应该将它们更改为ITaskItem的 这样 如果我有空间 就不会有问题 以前的代码 public class Compresso
  • 使用 facebook-android-sdk 4 未触发登录回调

    我有一个活动供用户使用 Facebook 登录 我使用 facebook android sdk v4 0 0 但是当用户点击登录按钮时 不会触发登录回调 显示进度条后 自动开始之前的活动 日志上不显示任何错误 而不是触发登录回调 在注册活
  • WCF 如何启用元数据?

    我正在尝试让我的 svc 文件在 IIS 下工作 在我的项目中 当我按 F5 时 svc 就开始工作了 所以我知道一切都好 对吗 IIS 除外 我正在 Windows XP Pro 计算机上工作 并在 IIS 中添加了一个虚拟目录 这是我的
  • Android MapView 带有滑动菜单遮挡菜单

    我在使用此滑动菜单的活动中有一个 android 地图 api v2 的地图视图https github com iPaulPro SlidingMenu https github com iPaulPro SlidingMenu 除了在地
  • WSO2 ESB - 用 Base64 写入文件

    我有一个代理 它接受包含 Base64 编码文件的 XML 文件 例如 XML 如下所示
  • Async Servlet - 首选实现

    最近 在研究异步处理时Servlets 我至少遇到了三种实现方法 使用这种方法的一些功能 问题是 哪一个是最好的 也许其中一些方法不推荐 也许还有另一种方法比下面提到的所有方法更好 找到的方法 Using AsyncContext star