2011-04-29 61 views
0

我看了一下Servlet 3.0实现服务器推送here的简要概述,并留下了比我更多的问题。这些问题与我的使用案例有关:在Facebook的“朋友”中实施动态通知系统。从概念上思考这个问题,我想接近它像这样:Servlet 3.0和Comet/long-polling:在这些特定场景中会发生什么?

  1. 把无限的jQuery循环中的每个 页,包含代码发出 XMLHttpRequest的“获取”请求 服务器
  2. 允许服务器于与这些 类型的XMLHttpRequest的 请求/响应的对象存储在一个 应用程序作用域图(与AsyncContext和 .startAsync()的 帮助),通过用户的 网站ID键控
  3. 每当用户在产卵通知的动作 配合,查询 应用范围的地图的 用户的朋友的ID,并使用存储在那里的 响应对象,发送 通知给每个朋友。
  4. 每个朋友收到 通知,以及他们是在问题页无限循环 再次 的XMLHttpRequest(由于无限循环)

假设我的系统是概念上的声音(如果它不是,请告诉我,什么是错的),有一对夫妇的问题,我用这个系统看到:

  1. 响应之后发生的请求/响应 对地图中的什么 是使用d?我应该手动 从地图中删除,或等待 环路在客户端发送 另一个请求,从而所存储的 请求/响应对象对可更换用 新的XMLHttpRequest相关联的一对 ?上面的链接 使用单词“承诺”和 “未提交”参照 响应对象。有人可以解释 这个词的意思吗(我有一种感觉 它们与 响应对象的长寿有关)?

  2. 如果两个或两个以上的用户朋友在完全相同的时间参与引发通知的操作,会发生什么情况?每个用户只存储一个请求/响应对。无论朋友的行为如何发现有问题的用户的请求/响应对都会将其通知发送给该用户,但其他朋友的行为又如何呢?如果它们全部同时发生,那么其他操作将不会有请求/响应对用于发送通知,直到用户发送另一个XMLHttpRequest以存储在地图中。据推测,其他操作会解析该映射,并且找不到该用户的条目(因为在其他操作使用该响应之后手动删除了该条目),或者找到已经使用的“陈旧”请求/响应对象。我假设一个响应对象不能用于两种不同的响应,那么有人会如何解决这个问题呢?

  3. 如果通知是 发送给用户,当用户 切换页面时会发生什么?如果我们把一个完全 加载的网页作为一个开放的窗口 用于接收通知请求, 和装载一个作为一个封闭的窗口 (因为它是无法接受和 到之前 页面发送 XMLHttpRequest的过程反应),在此期间 期间发送的通知将会丢失。是 有什么我可以做到的 查询数据库新的 行动和生成通知 页面加载?

  4. 最后,当用户 导航离开该站点和 会话到期时会发生什么?我们是否期望 定期迭代地图 并删除与 相关联的没有现有会话的请求?

对不起,如果这是一个很长的阅读。即使你只能回答上述问题之一,它也会有所帮助!

回答

1
  1. 响应被保留,直到它可能超时。你一遍又一遍地推动新的信息。这就是彗星。您不会永远循环获取请求,您将处理从服务器流出的数据,因为它会发出请求,1请求将持续到超时为止,然后在完整的函数中发出另一个请求。

  2. 同样,响应仍然可用,您只能在上面写,而不是每次关闭它。

  3. 一种方法是对所有通知进行时间戳记并从某一时间加载数据,然后您的初始获取请求会提供时间戳,然后您就可以获得最新数据。

  4. 我再次假设你持有它,直到它超时。

所以只是为了更好地解释这里发生了什么,

  • 你的页面加载和发送GET请求。
  • 请求/响应存储在地图中。
  • 然后每个更新都在SAME请求/响应对上发送。
  • 您的获取请求会侦听readystate === 3(收到数据)并读取获取已发送的任何新数据的数据。
  • 当他们超时/发送了一定数量的数据/无论他们被删除。
+0

谢谢!我看了一下API的异步功能,看起来像这样工作。我很困惑,因为维基百科说以下内容:“...浏览器发出服务器的异步请求,可能会等待数据在响应之前可用...在响应处理结束时,浏览器会创建并发送另一个XHR,等待下一个事件...因此,浏览器始终保持对服务器的未完成请求,并在每个事件发生时予以解答。“网络上的很多其他材料也定义了这样的长轮询。 – Kevin 2011-05-05 07:49:29

+0

@Kevin,这确实是长轮询,你在问题中描述的是一种不同的彗星风格,称为流式传输,**不是**长时间轮询。我认为这是你的困惑所在。 – Andrew 2011-05-05 14:25:11

+0

啊...由于某种原因,我认为servlet 3.0它的实现只是长轮询,它似乎默认实现了流式传输,并且为了实现长轮询而提交响应(通过调用complete())是可选的。 – Kevin 2011-05-05 14:47:26

相关问题