我来自Java SE背景,并且做了一些servlet教程,并阅读了Head First
JSP和servlet。我现在正在阅读有关异步支持的JavaWorld.com文章,但我不太了解。
异步到底是什么?Ajax和Servlet Async有什么区别?
PS我有一个使用ajax的PHP背景,我知道这个概念,但是我还没有用java尝试过
在传统的Servlet模型中,通常1个请求对应1个线程。
这些线程通常来自由Servlet容器管理的池。只要Servlet容器在此池中有空闲线程,就只能处理新请求。只要您自己的代码正忙于处理请求,线程就不会空闲。
在某些情况下,打破这种模式可能是值得的。发生的情况是,请求通过这样的Servlet容器托管线程到达Servlet,然后您的代码要求异步执行。然后,您可以从Servlet请求返回,然后将释放容器线程。
与同步请求处理相反,这将不会提交任何响应,也不会关闭连接。相反,您可以将异步上下文移交给另一个线程池,该线程池可以将其拾取,并且当某个线程有空处理它时,可以为其提供服务并能够写入响应。
一个例子:
@WebServlet(urlPatterns = "/somepath", asyncSupported = true)
public class AsyncServlet extends HttpServlet {
@EJB
private AsyncBean asyncBean;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
AsyncContext asyncContext = request.startAsync();
// The following line will not block and return immediately
asyncBean.doAsyncStuff(asyncContext);
} // Shortly after this method has ended, thread will be returned to pool
}
随着AsyncBean
被实现为:
@Stateless
public class AsyncBean {
@Asynchronous
public void doAsyncStuff(AsyncContext asyncContext) throws IOException {
asyncContext.getResponse().getWriter().write("test");
}
}
在上面的代码中,从AsyncServlet#doGet()
方法返回后不久,Servlet线程将返回到池中。用于执行的“请求”(任务)AsyncBean#doAsyncStuff()
将被放入队列中,以供EJB线程池使用。
为什么使用WHY和何时使用的答案并不那么简单。如果您只想保留线程,那么在上述情况下,您将一个线程池中的一个线程交换为另一个线程池(在这种情况下,是Servlet池与EJB异步池),那么净收益不会那么多。您也可以给Servlet线程池一个额外的线程。
但是,在更高级的方案中,您可以对请求进行更细粒度的管理。将它们分为多个任务,并为这些任务提供线程池。例如,想象一下,由10个线程处理的10MB文件有100个下载请求,这些线程循环发送给每个请求100KB的时间。
另一个应用是需要等待来自外部系统的数据的请求,并且该外部系统能够发送可以中继回请求者的消息。也就是说,这里的数据库调用没有意义,因为无论如何您都需要另一个线程来等待响应。然后,您将一个线程再次更改为另一个线程。但是,如果您需要等待传入的电子邮件,那么一个线程可以等待任何电子邮件并将其转发给任何暂停的请求。
Dart 的库充满了返回 Future 或 Stream 对象的函数。这些函数是“异步的”:它们在设置一个可能比较耗时的操作(比如 I/O)后返回,而不去等待操作完成。 关键字 async 和 await 支持异步编程,可以使你用看起来像同步的方式编写异步代码。 处理 Futures 当你需要一个已完成的 Future 的结果时,你有两个选择: 使用 async 和 await。 使用 Futur
问题内容: 我正在编写代码。在我获得android v 9.0(Pie)的更新之后,它在版本8(Oreo)上运行良好,并且应用突然停止工作。检查后,我在我的Asyn任务中收到一条错误消息,指出以下错误: 任何人都可以帮我解决这个问题的确切原因,因为它之前工作得很好。先感谢您。 问题答案: 我也遇到了同样的问题,但是在清单文件中添加以下代码后,问题得到解决 作为参考,您还可以检查以下网址:https
问题内容: 我已经使用了很长一段时间了(使用python绑定以及大多数情况下),每次我需要执行javascript代码时,我都使用过method。例如,用于滚动页面(python): 或者,要在另一个元素(量角器)内无限滚动: 或者,为了获取所有元素属性的字典)(python): 但是,WebDriver API也具有我个人未使用过的功能。 它涵盖了哪些用例?什么时候应该代替常规? 这个问题是se
问题内容: 我认为我对 .NET 的经验可能会影响我的理解,因此我想一些代码示例: 我正在尝试让快速控制器在返回响应之前等待5秒: 该代码不起作用,浏览器不断加载和加载,从不显示任何内容。 我基于此SO答案构建的函数以及控制器方法,是基于(对)其工作原理的(错误的)理解,因此我需要进行一些澄清和更正: 1.我应该什么时候使用? 据我了解,您应该在函数调用之前使用。这样对吗?另外,为什么我可以在返回
我希望我的请求触发一些长时间运行的操作,这些操作应该在后台执行。我编写了以下实现,应该在后台处理我的操作,但实际上我的请求是同步执行的: 在日志中,我看到以下内容: 我看到我的在另一个线程中执行,但出于某种原因,我的原始请求等待sleep完成 更新1:
存储库: 数据: