【问题标题】:How to handle asynchronous Java calls from an AJAX call如何处理来自 AJAX 调用的异步 Java 调用
【发布时间】:2010-08-11 15:33:28
【问题描述】:

我想对我的 Java webapp 进行 AJAX 调用。 Java webapp 将依次在别处进行异步返回调用。该调用的结果将作为 AJAX 请求的结果返回。

我的问题的症结是在等待第二次调用返回时我会如何处理 HttpRequest?

我是在 AJAX 处理程序方法中阻塞并等待调用,还是将请求存储在某处并等待回调?我将如何处理错误/超时?

对于那些关心我如何得出这种情况的进一步信息的人如下:

这是基于 XMPP 的即时消息系统的一部分。有一个全球支持用户,在我们的 web 应用程序的每个页面上都显示为一个图标。我还想显示这个用户的存在,所以,我可以使用 IM 系统在每个用户的每个页面加载时请求这个用户的存在,最终我自己进行 DDOS。相反,我想让一个用户定期从 webapp 查询存在并缓存结果。

因此,AJAX 调用将发送到服务器,然后服务器将返回缓存的存在或异步查询 XMPP 服务器。

【问题讨论】:

  • 你能澄清一下你说的是哪个HttpRequest吗?你说的是Java中的XMLHttpRequest还是HttpServletRequest

标签: java ajax asynchronous xmpp httprequest


【解决方案1】:

您不必阻止并等待 AJAX 调用。也就是说,不要同步进行调用。在 Java 端应该做的是找出一种在等待响应从异步调用返回时进行阻塞的方法(即找出一种方法来同步发出请求。第一次调用任何 new 数据时,性能会受到影响。后续调用会影响缓存,所以你应该没问题)。您可以为此数据维护一个缓存,因此您可以先检查缓存以查看数据是否存在。如果它没有进行调用并将结果存储在缓存中。否则,从缓存中获取数据并将其发送回视图。由于 AJAX 是异步的,一旦数据从服务器返回,您的回调就会被调用。

【讨论】:

  • 我从未打算阻止 AJAX 调用,但除此之外,这几乎是我最终所做的,所以代表是你的。谢谢大家。
【解决方案2】:

这是我要做的:

  • 当页面启动时,初始化一个作业来检索该特定页面所需的数据数组,您需要识别作业和作业结果以供以后使用
  • 使用页面中的 ajax 轮询作业结果,一旦作业完成,轮询结束并返回数据
  • 按照 Vivin 的指示缓存您请求的条目
  • 在您的服务器上缓存作业结果并为其提供超时选项

【讨论】:

    【解决方案3】:

    HTTP 请求,即 HttpServletRequest 对象不可序列化。因此,在通话期间,您不能将它们存储在任何类型的持久存储中。无论如何,存储请求是没有意义的,因为鉴于 HTTP 协议的无状态特性,它的生命周期仅限于 HTTP 请求本身的持续时间。

    这实际上意味着您必须在调用期间保留 HttpServletResponse 对象。不再需要 HttpServletRequest 对象,一旦执行了 HTTP 请求的解析,并且一旦所有数据都可用于您的应用程序;响应对象在您的上下文中很重要。

    可以使用用户状态的缓存副本填充响应。如果缓存中的副本过时,您可能希望从 XMPP 服务器同步刷新它(毕竟,它只会影响一页加载的性能)。您可以从应用程序服务器中异步查询,但必须将一些结果返回给浏览器(因此可能需要注意一些边缘情况)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-10
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多