Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Tomcat 7中使用NIO Http连接器-它将我限制为一个连接?_Tomcat_Nio - Fatal编程技术网

在Tomcat 7中使用NIO Http连接器-它将我限制为一个连接?

在Tomcat 7中使用NIO Http连接器-它将我限制为一个连接?,tomcat,nio,Tomcat,Nio,我想做一个服务,它基本上保持一个连接,直到建立第二个连接,告诉它停止保持第一个连接 使用具有所有默认设置的NIO Http连接器(在Tomcat和连接器中) 我使用一个线程(很像tomcat aio文档中的“messageSender”类)来保存第一个响应,并每5秒写入/刷新一个字符。这是工作正常-线程持有它和释放它的线索。唯一的问题是,在我关闭第一个连接之前,服务('event'方法)不会得到第二个调用(对于第二个连接的'begin'事件) 重复一下,发生的情况如下: 连接1->tomcat创

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

使用具有所有默认设置的NIO Http连接器(在Tomcat和连接器中)

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

重复一下,发生的情况如下:

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

event给出对“myDaemonThread”的响应(该线程保存引用并每隔5秒写入响应)。退出方法

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

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

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

tomcat(创建??现在或更早,不知道)线程“http-nio-8081-exec-6”调用连接2的myService.event(event.BEGIN)

。。。。。。其余的都不重要

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

可能的原因
  • Tomcat不允许同时从同一客户机发出两个相同的请求
  • 客户端“在幕后”将相同的请求排队
  • 不管怎样,结果是,如果我为第二个请求更改客户机,一切都正常。如果我在同一个客户机上的第二个请求中添加了垃圾参数,那么效果很好

    解决方案
    将垃圾参数添加到请求中

    为什么?如果您正在启动一个线程,然后只是等待它完成,为什么不运行线程运行的方法呢?首先,为什么要保持连接打开5秒钟?如果没有看到一些实际的代码,就不可能确定你做错了什么。我花了这么长的时间来描述到底发生了什么,因为你不需要代码来解决这个问题。这是(我怀疑)一个基于Tomcat/Comet(设置)的问题——不是基于代码的,尽管我想我应该这么说。只是偶然发现了这篇文章,无法详细研究ti,但在我的脑海深处,有人说这可能是http协议定义的潜在限制……我投了赞成票。我一直在努力让它在我的应用程序中工作。即使在我启用NIO之后,使用服务流的所谓Comet也不起作用,我很高兴我找到了这个页面。我明天会尝试这个,将垃圾参数传递给每个请求。我在其他地方也看到过。就像iPad上的Safari一样,它会自动缓存相同的请求。甚至外向。在请求中放入随机垃圾会有所帮助。我不认为这可能是客户端浏览器排队请求。至少在本例中,它不会进行缓存,因为第二个连接已经建立。事实上,浏览器排队很有意义。