2

我想创建一个基本上保持连接的服务,直到建立第二个连接来告诉它停止保持第一个连接。

将 NIO Http 连接器与所有默认设置一起使用(在 Tomcat 和连接器中)。

我使用一个线程(很像 tomcat aio doc 中的“messageSender”类)来保存第一个响应并每 5 秒写入/刷新一个字符。这工作正常 - 线程持有它并在提示时释放它。唯一的问题是服务(“事件”方法)在我关闭第一个连接之前没有得到第二个调用(对于第二个连接的“开始”事件)。

所以重复一遍,这就是发生的事情:

连接 1 - > tomcat 创建调用 myService.event(event) 的线程“http-nio-8081-exec-2”;

myService.event 将响应提供给“myDaemonThread”(它保存引用并每 5 秒写入响应)。退出方法。

'myDaemonThread' 使用 "synchronized (this){ this.wait(5000); }" 等待(最初使用 Thread.sleep() 但为了使其工作,我改为 wait() )

连接 2 - > 已启动但没有线程调用 myService.event

连接 1 在浏览器中停止,tomcat 创建调用 myService.event(event.END) 的线程“http-nio-8081-exec-4”。退出方法。

tomcat(现在或更早创建?

……其余的都不重要了。

所以这似乎违背了使用 NIO 的全部目的......有人知道为什么会这样吗?

4

1 回答 1

1

可能的原因

  1. Tomcat 不允许同时来自同一个客户端的两个相同请求
  2. 客户端在“幕后”对相同的请求进行排队。

无论如何,结果是,如果我为第二个请求更改客户端,一切正常。如果我在同一个客户端的第二个请求中添加垃圾参数,它工作正常。

解决方案

向请求中添加垃圾参数

于 2012-05-01T06:48:16.813 回答