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 - 首选实现 的相关文章

  • 更改 Ubuntu Linux 中文件夹的读/写访问权限

    我想创建一个文件夹并在创建的文件夹中写入一个文件Amazon EBS来自安装在运行 Ubuntu 的 Amazon EC2 上的 Java Servlet 的卷 我已将 EBS 卷安装在 mnt my address 但是Servlet无法
  • 为 JSP 创建注销链接?

    当用户登录我的应用程序时 他提交一个要通过 Servlet 处理的表单 servlet 为用户创建一个会话 我如何创建一个链接以便用户可以注销 我似乎无法直接链接到 Servlet 如何删除会话并链接回主页 HttpSession sess
  • Vue js按钮冻结dom

    我试图在按下按钮时切换包含加载动画的跨度 直到使用 v if 函数完成 但是当我按下按钮时 DOM 冻结并且 span 元素保持不变 直到函数调用结束 如何让 DOM 不冻结并显示加载图标 非阻塞按钮按下可能是一个解决方案 HTML
  • 为什么流行的 JavaScript 运行时不能处理看似同步的异步脚本?

    As 牛仔在这里的评论中说道 https gist github com domenic 3889970 我们都希望 以类似于以下的风格编写 非阻塞 JavaScript 异步代码 try var foo getSomething asyn
  • 为什么找不到 getservletcontext?

    我正在尝试使用getServletContext getRealPath 但我不断收到此错误 cannot find symbol symbol method getServletContext location interface jav
  • 如何并行执行PowerShell函数多次?

    我不确定是否需要将其称为多线程 基于作业或异步的需求 但基本上我有一个 Powershell 脚本函数 它需要多个参数 并且我需要使用不同的参数多次调用它并让它们运行在平行下 目前 我这样调用该函数 Execute param1 param
  • 有没有办法测量 Java (Servlet) I/O 流量?

    我尝试做的是使用以下代码实现 servlet 过滤器 int up request getContentLength if HttpServletRequest request getQueryString null up Math max
  • 通过执行本机操作系统的命令(例如curl)通过MySQL调用HTTP GET请求

    我使用的是在 32 位 Microsoft Windows XP 专业版 2002 Service Pack 3 上运行的 MySQL 5 6 11 我安装了MySQLsys exec https github com mysqludf l
  • 如何在分形绘图递归函数中创建延迟

    我正在玩一个分形绘图递归函数 遇到了雄辩的 JavaScript https eloquentjavascript net 我想为每个分支的绘制设置一个延迟 以便在我修改此函数及其参数时可视化分支 递归调用的流程 我用过的方式setTime
  • 如何在 JPA 2 / Hibernate 中进行可移植和本机 ID 生成?

    我希望在当前运行 Hibernate 和 MySQL 的 JPA 2 实体上生成本机和可移植的 ID 当使用 GenerateValue strategy AUTO 时 hibernate 默认为 MySQL 上的 hibernate se
  • LoaderManager 不接受“这个”

    好吧 我投降 我想不明白 我正在学习 Udacity 的 Android 基础知识课程 需要了解如何使用加载器加载数据 但是 当我使用以下行时 this 以红色突出显示并显示以下错误 Wrong 3rd argument type Foun
  • 浏览器中的javascript:异步任务执行模型

    我正在尝试集中注意力并了解 javascript 异步在单线程浏览器环境中的工作原理 作为异步 我们可以同时处理计时器和 xhr 请求 现在假设我有类似下面的东西 function doStuff for var i 0 i lt 1000
  • 使用 Rx 简化异步 Silverlight Web 服务请求

    我已经使用 Rx 为我的 WCF Web 服务编写了一个简化的 Silverlight 客户端库 但是我注意到有时我会丢失已完成的事件 public IObservable
  • 在 Java Servlet 应用程序中设置 HTTP 201 响应的 Location 标头的正确方法是什么

    考虑以下代码向客户端发送 HTTP 201 已创建 响应 String url app things id 42 example response setStatus HttpServletResponse SC CREATED respo
  • 仅在文件下载完成后设置 cookie。

    我有一个场景 我想告诉用户下载完成并提示关闭按钮 为此 我使用 jquery 插件来连续监视 cookie 以了解下载何时完成 我的问题是我想设置这个cookie fileDownload true and path 下载完成后立即进行 为
  • async.js 和系列问题

    连接后尝试运行 fetch 提取比连接更快 并且在控制台中我收到提取错误 因为它返回结果的速度比连接完成的速度快 但在异步系列的文档中 有一个工具可以在第一个返回结果后运行第二个函数 Settimeouts 可以保存情况 但它并不美观 当一
  • 有没有更快的方法来输出PDF文件?

    这是一段将PDF文件输出到浏览器的代码 可以更快吗 这是在 Java servlet 中实现的 private ByteArrayOutputStream getByteArrayOutputStreamFromFile File file
  • ServletContext 是每个 Web 应用程序一个还是每个 JVM 一个?

    这是我提出的一个疑问 ServletContext 是每个 Web 应用程序一个 每个 JVM 一个 但是如果我在同一个 JVM 上运行多个 Web 应用程序 然后每个 JVM 有 2 个 ServletContext 是否可以 有人可以详
  • future::select 之间有什么区别!和东京::选择?

    我正在使用 Tokio 我想接收来自两个不同的请求mpsc队列 select 似乎是要走的路 但我不确定两者之间有什么区别futures select and tokio select 在什么情况下应该使用其中一种而不是另一种 tokio
  • JavaScript 中的 Promise 有什么意义?

    一个承诺是一个 可能现在可用 或将来可用 或永远不可用的值 来源 MDN 假设我有一个想要处理图片的应用程序 图片已加载 例如在算法在后台使用它之后 或某种其他类型的延迟 现在我想检查一下图片是否可以在future 通过使用承诺 而不是回调

随机推荐

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

    除了这个之外 是否有更好的方法来计算谓词函数为 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