我想多线程我的GAE servlet,以便同一个实例上的同一个servlet可以同时处理多达10个(在前端实例上,我相信最大#线程是10个)来自不同用户的并发请求,他们.
public class MyServlet implements HttpServlet { private Executor executor; @Override public void doGet(HttpServletRequest request,HttpServletResponse response) { if(executor == null) { ThreadFactory threadFactory = ThreadManager.currentRequestFactory(); executor = Executors.newCachedThreadPoolthreadFactory); } MyResult result = executor.submit(new MyTask(request)); writeResponseAndReturn(response,result); } }
所以基本上当GAE启动时,第一次获取到这个servlet的请求时,会创建一个Executor,然后保存.然后每个新的servlet请求使用该执行器来生成一个新的线程.显然,MyTask中的一切都必须是线程安全的.
我关心的是这是否真的能够做到我所希望的.也就是说,这个代码是否创建一个可以同时处理来自多个用户的多个请求的非阻塞servlet?如果没有,为什么我需要做什么来解决它?而且,一般来说,GAE大师可以发现哪些是错的?提前致谢.
解决方法
我不认为你的代码可以工作.
doGet方法正在由servlet容器管理的线程中运行.当一个请求进入时,一个servlet线程被占用,并且直到doGet方法返回才会被释放.在你的代码中,executor.submit将返回一个Future对象.为了获得实际的结果,您需要在Future对象上调用get方法,并且将阻止MyTask完成其任务.只有在此之后,doGet方法才能返回,新的请求可以启动.
我不熟悉GAE,但根据their docs,您可以将servlet声明为线程安全的,然后容器将并发分配多个请求到每个Web服务器:
<!-- in appengine-web.xml --> <threadsafe>true</threadsafe>