问:从AppEngine的Servlet调用Web服务(每秒0.5-1.5秒)的最佳方式是什么?阻止呼叫在AppEngine环境中是否可扩展?从AppEngine的Servlet调用Web服务
上下文:我正在开发一个使用AppEngine和J2EE的Web应用程序。这些应用程序调用Amazon Web服务来为用户获取一些信息。从我的asp.net经验来看,完成这些调用的最好方法是使用异步http处理程序来防止在IIS线程池中出现饥饿。对于Servlet 2.5规范的J2EE(3.0 is planned),此功能不适用。
现在我正在考虑让我的控制器(和servlets)线程安全并请求作用域。我还能做些什么吗?这是J2EE + AppEngine环境中的问题吗?编辑:我知道AppEngine和JAX-WS的异步调用支持,但我不确定它如何与servlet环境一起玩。编辑:我知道AppEngine和JAX-WS的异步调用支持,但我不确定它如何与servlet环境一起玩。据我了解,要完成servlet请求,代码仍然应该等待异步WS调用完成(回调或其他)。 我假设使用同步原语做它会阻塞当前工作线程。
因此,就线程被阻塞而言,为了服务另一个用户请求,servlet容器需要在线程池中分配新线程,为堆栈分配新内存并浪费时间进行上下文切换。而且,当线程池中的线程用完时,请求可能会阻塞整个服务器。这个假设基于ASP.Net和IIS线程模型。它们适用于J2EE环境吗?
回答:在研究Apache和GAE文档后,线程池中线程的匮乏似乎不是真正的问题。 Apache默认情况下有200个线程池的线程(与asp.net和IIS中的25个线程相比)。基于此,我可以推断出线程在JVM中相当便宜。
如果真的需要异步处理,或者servlet容器将耗尽线程,可以重新设计应用程序以通过google channel API发送响应。 的工作流程是这样的:
- 使同步请求与Servlet
- 的Servlet使得对background工人创造了异步回复和队列任务通道
- 的Servlet返回响应客户
- [服务其他请求]
- 后台工作人员通过处理并将数据推送到客户端channel api
Web服务结果是否需要显示给用户?你不能将ws调用转移到后台任务队列吗? – systempuntoout
是的。用户调用搜索请求,并且WS执行实际搜索。但为此实施一种共享方案是一个好主意! –