Play Framework 1.2.4在异步线程中同步作业:可能吗?

时间:2012-04-12 11:40:31

标签: ajax multithreading asynchronous playframework playframework-1.x

我正在开发一个严重依赖主用户页面上的ajax请求的项目。

在当前网页中,我有一个“n”个相同的视图,每个视图都有一个ajax请求。所以当使用加载页面时,会有“n”个ajax请求同时运行。

还有另一个设计问题,在第一个请求运行后,其他请求将从缓存中收集数据。继承人的工作流程:

请求:

  1. 发送请求
  2. 检查缓存是否具有所需的值
  3. 如果不可用,则从网络服务器收集数据(其中 需要一些时间)
  4. 收集数据,将“x”分钟的值写入缓存。
  5. 返回值 。
  6. 因此,如果我可以设法在开始时只运行一个请求并让其他请求等待第一个请求完成,那么他们将能够使用缓存上可用的数据,这将极大地提高性能。

    问题是播放所有作业异步所以事件那些请求在第一页加载时不会看到缓存值..

    所以我需要做的是:

    ----Main ASYNC Thread------
    -------first View Request----
    -------second Request (it will run after the first one so it will read from the cache---
    ----- and so on...
    

    那么,我如何将请求放入队列或如何让其他请求“等待”是否可能?

    我知道我应该为此设计应用程序,但页面设计和javascript设计来自外部源。所以我没有时间研究这些事情..

    感谢您的帮助..

1 个答案:

答案 0 :(得分:0)

如果将数据加载逻辑封装在一个方法中,则可以同步该方法中的所有线程,例如。使用AtomicBoolean标志。

private final AtomicBoolean initialised = new AtomicBoolean(false);

public Data getData() {
   Data data = null;
   if (!initialised.get() && initialised.compareAndSet(false, true)) {
     cache.put(loadData());
   }
   while ((data = cache.get()) == null);
   return data;
}

只是其中一种方法。