使用 HTML5 服务器事件和 Java Servlet 时如何防止 net::ERR_INCOMPLETE_CHUNKED_ENCODING?

2024-03-07

我刚刚开始玩服务器事件,遇到了一条我想了解的 chrome 错误消息。我很快在网上搜索,但没有找到解释,所以我想我可能做了一些非常错误的事情。

在服务器端,我有一个简单的 servlet,它接受请求并创建一个虚拟事件创建器任务:

private Executor executor = Executors.newSingleThreadExecutor();

public void doGet(final HttpServletRequest request, final HttpServletResponse response)
{
  final AsyncContext asynCtx = request.startAsync(request, response);

  response.setHeader("Cache-Control", "no-cache");
  response.setContentType("text/event-stream");
  response.setCharacterEncoding("utf-8");

  executor.execute(() -> {
    boolean run = true;
    try
    {
      while (run)
      {
        final ServletResponse resp = asynCtx.getResponse();
        run = resp != null;

        if (resp != null)
        {
          System.out.println("pushing a server event.");
          final PrintWriter writer = asynCtx.getResponse().getWriter();
          writer.println("data: {time: " + System.currentTimeMillis() + "}\n");
          writer.flush();
        }
        else
        {
          System.out.println("stopping beeper, no response object available anymore.");
          break; // do not run anymore, we got no response
        }

        Thread.sleep(2000);
      }
    }
    catch (final Exception e)
    {
      e.printStackTrace();
    }
  });

}

在客户端我只是:

$(document).ready(function ()
{

   var source = new EventSource("/events");
   source.onmessage = function (event)
   {
     console.log("received event: " + JSON.stringify(event));
     document.getElementById("eventContainer").innerHTML += event.data + "<br/>";
   };

   console.log("start to receive events...")
});

当我加载 HTML 文件时,它工作正常,接收事件并将其写入控制台。但30秒后我收到一条错误消息:

GET [HttpOfLocalhost]/events net::ERR_INCOMPLETE_CHUNKED_ENCODING

why?

该请求会被终止,并立即启动一个新请求,因此它不会终止应用程序,但控制台上的错误消息并不好。

我的开发者控制台的屏幕截图:

请求/响应详细信息:

计时,这表明它总是在 30 秒后发生:

Thanks!


好吧,所以我不能站着不动,仔细看看发生了什么。

The 异步上下文 https://docs.oracle.com/javaee/6/api/javax/servlet/AsyncContext.html对象有一个设置超时(...) https://docs.oracle.com/javaee/6/api/javax/servlet/AsyncContext.html#getTimeout()方法。在我的 tomcat 版本(嵌入 Tomcat 8)中,默认值设置为 30,000 毫秒(30 秒)。这正是我得到后的持续时间净::ERR_INCOMPLETE_CHUNKED_ENCODING我的 Chrome 控制台出现错误。

我检查使用:

System.out.println("Current Timeout is: " + asynCtx.getTimeout() + " ms");

结果表明:

Current Timeout is: 30000 ms

因此,为了避免出现 net:ERR 消息,有人可以将超时设置为 0。但事件线程会永远运行(不幸的是)。 我使用的另一个解决方案是添加异步监听器 https://docs.oracle.com/javaee/6/api/javax/servlet/AsyncListener.html to the 异步上下文 https://docs.oracle.com/javaee/6/api/javax/servlet/AsyncContext.html并致电完全的() https://docs.oracle.com/javaee/6/api/javax/servlet/AsyncContext.html#complete()里面的方法超时() https://docs.oracle.com/javaee/6/api/javax/servlet/AsyncListener.html#onTimeout(javax.servlet.AsyncEvent)方法。

来自complete()方法的API文档:

完成根据请求启动的异步操作 用于初始化此 AsyncContext,关闭响应 用于初始化此 AsyncContext。任何类型的听众 已向 ServletRequest 注册的 AsyncListener 创建的 AsyncContext 将在其 onComplete 时调用 方法。

我的监听器的源代码:

asynCtx.addListener(new AsyncListener()
{
  @Override
  public void onComplete(AsyncEvent asyncEvent) throws IOException
  {
    System.out.println("onComplete(...)");
  }

  @Override
  public void onTimeout(AsyncEvent asyncEvent) throws IOException
  {
    // this will close the request and the context gracefully
    // and the net:ERR is gone.
    asyncEvent.getAsyncContext().complete();
    System.out.println("onTimeout(...)");
  }

  @Override
  public void onError(AsyncEvent asyncEvent) throws IOException
  {
    System.out.println("onError(...)");
  }

  @Override
  public void onStartAsync(AsyncEvent asyncEvent) throws IOException
  {
    System.out.println("onStart(...)");
  }
});

所以是的,这是由于缺乏知识。我希望这对某人有帮助。

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

使用 HTML5 服务器事件和 Java Servlet 时如何防止 net::ERR_INCOMPLETE_CHUNKED_ENCODING? 的相关文章

  • Java如何删除设置了IMMUTABLE位的文件

    正在开发一个 Java 8 项目 我从外部源复制文件 在这些源之一中 文件设置了不可变位标志 In OSX这是这样设置的 sudo chflags schg path to file In Linux chattr i path to fi
  • 使用Java获取CSS文件中图像的URL?

    我正在尝试使用 Java 获取远程 CSS 文件中图像 所有 MIME 类型 的 URL 我正在使用 jsoup 来获取 css 的 URL 经过无数个小时的观看CSS解析器 http cssparser sourceforge net 由
  • 使用 Hibernate 和 Apache DBCP 的 MySQL 连接池问题

    看来我的应用程序有问题 当应用程序在启动后闲置很长时间 我不确定确切的时间 时 我会在日志中收到以下错误消息 我使用 Spring Hibernate MySQL 和 ApacheDBCP 进行连接池 ERROR org hibernate
  • 如何让 HttpClient 返回状态码和响应正文?

    我试图让 Apache HttpClient 触发 HTTP 请求 然后显示 HTTP 响应代码 200 404 500 等 以及 HTTP 响应正文 文本字符串 重要的是要注意我正在使用v4 2 2因为大多数 HttpClient 示例都
  • Java 中支持多少维数组,例如 a[1][1][1][1]....[1]? [复制]

    这个问题在这里已经有答案了 Java支持多少维数组a 1 1 1 1 1 我可以为数组声明无限数量的维度吗 数组维数限制为 255 有趣的是 JLS定义的Java编程语言没有这样的限制 但是你可以在JVM规范 http docs oracl
  • 如何使 ScheduledExecutorService 在计划任务取消时自动终止

    我正在使用一个ScheduledExecutorService如果网络连接已打开超过几个小时 则关闭该连接 然而 在大多数情况下 网络连接在超时之前就关闭了 所以我取消了ScheduledFuture 在这种情况下 我还希望执行程序服务终止
  • 竞争性编码 - 以最低成本清除所有级别:未通过所有测试用例

    当我遇到这个问题时 我正在一个竞争性编码网站上解决问题 问题指出 游戏中有 N 个关卡和 M 种可用武器 等级编号从 0 到 N 1 武器编号从 0 到 M 1 您可以按任意顺序清除这些级别 在每个关卡中 需要这些 M 武器的某些子集才能通
  • FXML 文件中的 getHostServices().showDocument()

    有没有简单的方法可以将 getHostServices showDocument 命令放入 toHomepage 方法中 而不是执行一行又一行的代码 这样代码应该看起来干净简单 package sample import javafx ap
  • 将 RequestBody json 转换为对象 - Spring Boot

    我是 java 开发的初学者 但之前有 PHP 和 Python 等编程语言的经验 对于如何进行 Spring Boot 的开发几乎没有什么困惑 我正在开发一个rest API 它有以下请求 key value key1 value1 pl
  • 处理 ANTLR 4 中的错误

    遵循后接受的答案 https stackoverflow com a 18137301 2279200的指示处理 ANTLR4 中的错误 https stackoverflow com q 18132078 2279200问题 我遇到了以下
  • a4j:commandLink 重新渲染后停止工作

    我创建了这个测试用例来隔离我的问题 一旦轮询执行 ajax 更新 a4j commandLink 操作就不会执行 如果我们在轮询重新渲染之前关闭 modalPanel 则会执行它 有什么建议吗 提前致谢 测试 xhtml
  • Java检测鼠标长按

    如果用户按下 JList 组件超过 3 秒 有什么方法可以捕获事件吗 我发现困难的部分是即使在用户松开鼠标左键之前也需要触发事件 这可以通过 mousePressed 和 mouseReleased 组合轻松完成 您可以在 mouseDow
  • java:如何设置全局线程ID?

    是否有可能为线程设置唯一ID 在分布式系统中 线程是在许多不同的机器上创建的 例如通过 RMI 我需要它来创建日志消息 根据我的研究 我知道可以使用 log4j mdc ndc 来完成 但只能在单线程中完成 我的问题是 在创建线程时必须设置
  • java.lang.ClassCastException: [B 无法转换为 java.lang.String

    我编写了一个带有字段 LoginId 和密码的实体类 我使用 AES ENCRYPT 加密密码并将其存储在数据库中 我只想检索已解密的密码 所以 我使用 AES DECRYPT 使用本机查询是在 OPen JPA 2 0 中 我写的查询是
  • iText7 将 SVG 添加到 PdfDocument 中以及可能出现的问题

    关于问题的答案 如何使用 iText7 将 SVG 添加到 PDF 这是一个链接点击这里 https stackoverflow com questions 50059456 how to add an svg to a pdf using
  • Wildfly 10.1 消耗所有核心

    我们最近将银行应用程序从 java 1 6 升级到 1 8 将 jboss 4 x 升级到 wildfly 10 1 我们观察到 java 消耗了机器上可用的所有核心 10 有人可以告诉是什么原因吗 通常情况下 jboss 4 x 的最大
  • Java XML 解析器添加不必要的 xmlns 和 xml:space 属性

    我在 Windows 10 上使用 Java 11 AdoptOpenJDK 11 0 5 2019 10 15 我正在解析一些旧版 XHTML 1 1 文件 这些文件采用以下一般形式
  • Java“非法访问操作”方法将被弃用? [复制]

    这个问题在这里已经有答案了 JDK 9 JVM 发出非法访问操作警告后 如果您使用一些非法访问 例如setAccessible 我的问题 Is setAccessible 以后会被封吗 此功能的官方参考 如果将被弃用 在哪里 我在任何地方都
  • 从数字列表中生成所有唯一对,n 选择 2

    我有一个元素列表 假设是整数 我需要进行所有可能的两对比较 我的方法是 O n 2 我想知道是否有更快的方法 这是我在java中的实现 public class Pair public int x y public Pair int x i
  • Java 应用程序启动,ProcessBuilder 一段时间后被阻止

    我正在开发一个 Java 桌面应用程序 我们称之为控制台 包含 3 个按钮 其中两个启动 Win32 应用程序 第三个应该启动一个可执行的 jar ProcessBuilder pb new ProcessBuilder java jar

随机推荐

  • 如何在 WPF 中播放 .flv 文件?

    如何在 WPF 中播放 flv 文件 请任何人帮助我 Create the interop host control var host new WindowsFormsHost Create the ActiveX control var
  • matlab中的散点极坐标图

    我正在尝试绘制楔形图 赤经与红移 我想我可以在极坐标中使用散点图 matlab中的极坐标函数似乎非常有限 甚至这个 polar a 1 a 2 Linewidth 1 给我一个错误 Error using polar line 23 Too
  • 在我的 math.h 中找不到 log2?

    我正在使用相当新安装的 Visual C 2008 Express 我正在尝试编译一个使用 log2 函数的程序 该程序是通过在 Mac 上使用 Eclipse 找到的 但是这台 Windows 计算机找不到该函数 错误 C3861 log
  • 通过 Segue 传递数据 (swift 2)

    这是一个小费计算器项目 它必须有一个设置视图 我可以在其中选择默认小费率 我在传递数据时遇到一些问题 当我选择默认小费百分比时 它在视图控制器中不会更改 而且我想让应用程序在关闭应用程序并重新打开时记住默认费率 如果有人纠正我的代码并对其进
  • 具有一个参数的多个构造函数

    因此 在学校我们接到了一项作业 用 OOP 制造一辆汽车 到目前为止 这一切都非常简单和直接 但现在我需要创建四个构造函数 一个不带参数 两个带一个参数 一个带两个参数 据我所知 重载的工作方式是检查您提供的参数数量 然后检查它必须使用哪个
  • ChartJS:图表不显示所有数据

    由于某种原因 该图表没有显示数组中的最后两个数据 var data labels Brasil Argentina Chile Paraguai Peru Bol via M xico datasets data 9 19 7 77 6 8
  • AWS API Gateway 始终返回 502 bad gateway

    我在 AWS 中创建了一个简单的 lambda 函数 它从 DynamoDB 返回列表 我还创建了 API Gateway 来触发 lambda 函数 当我在 AWS 控制台中测试时 该函数运行良好 但是当我在 Postman 中测试此功能
  • 如何删除 lambda 事件处理程序 [重复]

    这个问题在这里已经有答案了 我最近发现我可以使用 lambda 来创建简单的事件处理程序 例如 我可以订阅这样的点击事件 button Click s e gt MessageBox Show Woho 但你如何取消订阅呢 C 规范明确指出
  • 如何在文本中定义人名(Java)

    我有一些输入文本 其中包含一个或多个人名 我没有这些名字的字典 哪个 Java 库可以帮助我根据输入文本定义名称 我浏览了 OpenNLP 但没有找到任何示例或指南 或者至少没有找到如何将其应用到我的代码中的描述 我看到了 javadoc
  • AttributeError:“TimedeltaProperties”对象没有属性“分钟”

    我有一个看起来像这样的数据框 df output date time 2020 02 28 00 30 45 2020 02 28 00 30 45 2020 03 09 00 21 06 2020 03 09 00 21 06 2020
  • 应用程序退出,退出代码为 -1073740771

    我有一个 WPF 应用程序 有时会以退出代码 1073740771 退出 该问题不会以任何模式出现 并且因系统而异 在某些系统中 该问题的发生率不到总案例的 10 而在其他系统中 我发现该问题的发生率几乎占总案例的 30 我无法形成任何可靠
  • UIImagePickerController 选择视频会阻止 MPMoviePlayerViewController 实例工作

    我有一个视图控制器 我在其中呈现UIImagePickerController在弹出窗口中 如果用户选择视频 则关闭弹出窗口并移至下一个 页面 视图控制器 并尝试使用以下方式播放任何电影MPMoviePlayerViewController
  • 如何将图片转换为html?

    有没有办法将图像转换为html相当于图像 通过有一个html表分为许多单元格 每个单元格都有特定的背景颜色 就像图像中的像素一样 很像 ASCII 艺术 我认为这是一种在电子邮件签名中包含公司徽标的方法 而不必担心电子邮件客户端阻止图像 是
  • 每个数据库提供程序类型允许的最大参数数是多少?

    可以传递到 Sql Server 查询 即通过 ADO Net 的参数限制为 2 100 个 但是 Net 开发人员使用的其他常见数据库的记录限制是什么 特别是我感兴趣的是 甲骨文10g 11g MySql PostgreSQL Sqlit
  • JavaFX 偶发渲染问题 - 按钮/控件消失

    我有一个 Java JavaFX 应用程序部署为 Windows 和 Mac 的本机安装 目前捆绑的运行时间为 8 121 您可以在此处找到安装程序和 Java 代码 乔治下载 http www george andante no down
  • 基于 SML 的文件查找

    有没有办法使用 SML Basis 库在特定位置打开文件 也就是说 使用操作系统调用来更改位置 而不是扫描文件并丢弃数据 这很棘手 不幸的是 不直接支持搜索 此外 文件位置仅对于二进制文件是透明的 即您使用BinIO结构 1 对于该结构体
  • 如何获取两个列表并将它们组合起来排除任何重复项?

    我想从两个单独的独特项目列表中创建一个列表 还有其他类似的问题 但似乎没有任何问题涉及有效地解决这个问题 因为列表有几百万个项目长 完全无关 我是唯一一个讨厌标签建议框掩盖 发布你的问题 按钮的人吗 Use a set gt gt gt f
  • Protractor / Selenium XHR 保持“待处理”状态

    我正在使用 Protractor 和 selenium 来测试我的 Angular 页面 在某些随机点 它只是停止执行 因为 XHR 请求仍处于 待处理 状态 在 Chrome 开发工具中 当我复制请求 URL 这是一个简单的 GET 请求
  • 如何从 Eclipse 在 jetty 8 上运行 Web 服务 Maven 项目?

    我有一个之前创建并部署在 Tomcat7 中的 REST Web 服务 按照建议 我想将其部署在 Jetty 上在上一个问题中 https stackoverflow com questions 11691036 is it possibl
  • 使用 HTML5 服务器事件和 Java Servlet 时如何防止 net::ERR_INCOMPLETE_CHUNKED_ENCODING?

    我刚刚开始玩服务器事件 遇到了一条我想了解的 chrome 错误消息 我很快在网上搜索 但没有找到解释 所以我想我可能做了一些非常错误的事情 在服务器端 我有一个简单的 servlet 它接受请求并创建一个虚拟事件创建器任务 private