0

我们的用户从外部站点返回到我们的网站,当用户离开我们的站点时,该 URL 被传递到外部站点。返回我们的站点涉及到持久化到应用程序数据存储区的状态更新。

我在返回我们的网站时实施了一项检查,以防止对我们的数据存储进行多次写入,从而使操作具有幂等性。

一个典型的事件顺序是:

  1. 第一篇post到我们的登陆网页(网页实例1正在构建中)
  2. 第一篇文章通过检查(之前未处理的数据)
  3. 数据持久化开始(仍在网页构造函数中)
  4. 第二篇文章到我们的登陆网页(网页实例 2 正在构建),它与第一篇文章在同一个会话和浏览器窗口中
  5. 第二个帖子检查失败(数据已经或正在处理)
  6. 网页实例 2 构造函数完成(对数据存储没有持久性)并向用户提供 Web 响应
  7. 网页实例 1 构造函数完成(在持久化到数据存储之后)
  8. 用户在浏览器中看不到页面实例 1。

最终结果是,即使第二个帖子是在第一个帖子之后发布的,第二个帖子对用户来说“完成”得更快,并且用户的 Web 浏览器显示页面的实例 2,而不是实例 1。

我的问题是:

  • 有什么办法可以让第一个数据存储处理页面实例显示给用户(从而“扔掉”第二个页面实例)?
  • 如果是这样,不使用 AJAX 可以做到这一点吗?

我将不胜感激任何帮助。

我的开发环境

  • 网络框架:Wicket 1.5.7
  • 爪哇:1.6.0_33;Java HotSpot(TM) 客户端虚拟机 20.8-b03
  • 网络服务器系统:Google App Engine for Java 1.6.6 版
  • 操作系统:Microsoft Windows XP Home Edition 2002 SP3(在 x86 上运行的 5.1 版;Cp1252;en_GB)
  • IDE:NetBeans IDE 7.1.2(内部版本 201204101705)
4

1 回答 1

0

感谢@svenmeier 的第一个提示。我的解决方案遵循这种方法。我决定让页面实例 2 在必要时反复等待,而不是遵循@Carl-EricMenzel 的重定向建议。

参考我在问题中列出的事件顺序,步骤 6 替换为:

6.1 如果数据已经在处理,页面实例 2 会重复等待,同时在每次等待后检查。

6.2 在所有的等待之后,页面实例 1 将完成第 7 步(和第 8 步)。如果不是,则页面实例 2 完成构建。

6.3 如果实例 1 的数据处理成功,则页面实例 2 向用户显示成功。

6.4 如果实例 1 的数据处理失败,则页面实例 2 处理数据并向用户显示结果(成功/失败)。

于 2012-07-05T11:02:47.720 回答