当两个同时发出的请求来自同一个ip时,Tomcat的行为

时间:2011-02-16 07:04:29

标签: java tomcat

当我尝试同时向我的服务器(http:// myserver)运行2个wget命令时,看起来tomcat会分配两个线程来处理它们。但我相信当tomcat从同一个ip地址同时收到两个时,它不会创建一个新的线程来处理第二个请求,因为它认为这两个请求来自同一个会话。

如果我想检查线程是否相同或不同,是否只使用thread.getId()?我认为这个id可以重用于新线程。除了threadid之外,是否存在检查其身份的线程的唯一属性?

3 个答案:

答案 0 :(得分:2)

我建议永远不要依赖线程来识别它们的来源。有关线程的没有Servlet规范保证,而较新的Servlet规范实现使用了NIO。你在薄冰上滑冰。

答案 1 :(得分:1)

Web服务器几乎总是将多个线程(或进程)分配给多个并发请求,因为客户端可以在不必等待每个响应时更快地工作。

然而,较新的服务器可能使用异步IO(nio),并且单个线程可以同时为许多客户端提供服务。

是的, Thread.getId()是一种识别线程的方法。

会话ID是用于标识来自单个客户端的请求的机制。

IP地址不是一个好方法,因为多个机器在隐藏NAT后可以暴露相同的IP。

答案 2 :(得分:0)

我相信Tomcat总会创建一个新的执行线程,无论它是否来自同一个IP。如果在特定IP上运行的客户端应用程序具有跨会话ID发送的机制,那么Tomcat将简单地将相同的会话上下文与请求线程相关联[使其成为有状态]。

在你的情况下,你需要自定义wget以保持 session-id [Tomcat web-app可能通过cookie或作为url参数发送它 - {{ 1}}]。然后,wget将需要将其与后续请求一起发回[url rewrite并包含jsessionid参数,或交换cookie]。通过这种方式,Tomcat将能够处理来自唯一客户端实例的每个请求并将状态与其关联。