Java 使用tomcat和spring进行异步http请求处理
这是我的第一个问题,所以请耐心点:) 我正在尝试创建一个服务:Java 使用tomcat和spring进行异步http请求处理,java,multithreading,spring-mvc,tomcat,asynccontroller,Java,Multithreading,Spring Mvc,Tomcat,Asynccontroller,这是我的第一个问题,所以请耐心点:) 我正在尝试创建一个服务: 接收包含要查询的URL的HTTP GET请求 对于单个GET请求,服务提取URL 查询有关URL的本地数据库 如果在数据库中找到结果,它将返回给客户,如果没有,它将需要查询一些外部服务(这可能需要相对较长的时间来响应) 将URL的结果返回给客户端 我在虚拟机上运行这个,并使用spring运行Tomcat7。 我会提前道歉,并说我对Tomcat还很陌生 无论如何,我期望有很多并发的GET请求(数十万个并发请求) 我基本上想要实现的是使
干杯 这里面有很多问题,但我会尝试解决其中的一些问题 异步I/O是一件好事,特别是在服务大量请求的服务器上——它允许您使用更少的线程来处理更多的请求。对于您正在编写的代理,您确实希望您的HTTP客户机(对外部URL发出请求)也是异步的,这样无论是处理请求还是接收远程响应都不会阻塞I/O 也就是说,一般来说,使用Tomcat或JavaEE服务器来完成这项工作可能比使用这样的框架从一开始就是异步的要困难得多,因为这些服务器都附带了异步I/O。作为构建在Netty之上的框架的作者,我有点偏见 为了演示您需要执行所描述的操作的代码有多少,我编写了一个小型服务器,它执行您在3个Java源文件中描述的操作—它构建了一个独立的JAR,您可以使用
Java-JAR
来运行它,并尝试对其进行清晰的注释
归根结底,网络应用程序大部分时间都在等待I/O的发生。特别是在代理的情况下,使用传统的线程化I/O,您会收到一个请求,而接收请求的线程将负责同步响应该请求——这意味着,如果它必须向另一台服务器发出网络请求,该线程将被阻塞,等待来自远程服务器的响应。这意味着线程不能用于任何其他用途。因此,如果您有10个线程,并且所有线程都在等待响应,那么在其中一个线程完成并释放一个线程之前,您的服务器无法响应更多的请求。对于异步I/O,当某些I/O完成时,您会得到一个回调。换句话说,在操作系统将您的数据刷新到套接字并从网卡中取出之前,您的代码不是静止不动,而是在有事情要做时(比如代理请求的响应)只需轻轻地敲击一下您的肩膀即可。当您的代码等待HTTP请求完成时,发送代理请求的线程可以自由地用于处理另一个请求,这意味着一个线程可以对一个请求做一些工作,对另一个请求做一些工作,最终完成第一个请求。由于线程是由操作系统提供的有限资源,这允许您用更少的硬件做更多的事情
至于可调用的
与延迟的结果
,使用可调用的
只会在工作发生时移动