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

Posted

技术标签:

【中文标题】Play Framework 1.2.4 在异步线程中同步作业:可能吗?【英文标题】:Play Framework 1.2.4 Sync Jobs in an Async Thread: Possible? 【发布时间】:2012-04-12 11:40:31 【问题描述】:

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

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

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

请求:

    发送请求 检查缓存是否有所需的值 如果不可用,则从网络服务器(其中 需要一些时间) 收集数据,将“x”分钟的值写入缓存。 返回值 .

因此,如果我可以设法在开始时只运行一个请求并让其他请求等待第一个请求完成,他们将能够使用缓存中的可用数据,这将大大提高性能。

问题是异步运行所有作业,因此这些请求在第一页加载时不会看到缓存值..

所以我需要做的是:

----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】:

如果您将数据加载逻辑封装在一个方法中,您可以同步该方法中的所有线程,例如。使用 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;

只是其中一种方法。

【讨论】:

我已经通过两种方法解决了这个问题,首先我意识到有一个叫做 jquery.queue 的东西,所以我可以将 ajax 请求排队,然后我将逻辑更改为在第一次请求时计算并缓存所需的值,其他人只需查看缓存的值。 (逻辑类似于“查找缓存”,如果未找到“查找数据库”,如果未找到“执行计算”)在队列第一个缓存的帮助下,其他从缓存中获取数据。 BTW AtomicBoolean 刚刚超出我的知识水平,感谢分享这个信息,我接受你的回答,因为我也像你说的那样封装了数据加载逻辑......谢谢 Np。但是,如果您缓存的数据在多个用户/会话之间共享,或者说,类似的请求是从浏览器中的两个不同选项卡发送的(在这种情况下会话相同),您仍然会遇到最初的问题。这是因为将为每个加载的页面创建多个 jqery 队列。因此,服务器端的一些同步机制可能对解决您的问题至关重要。 感谢您提供的信息,我已经更新了我的应用程序,以便只有一个作业负责计算,并且我已将其他控制器与计算作业隔离开来。此外,我还添加了一个作业模型,以查看是否有另一个线程在运行所需的作业等。在一般 imo 中处理异步作业真的很困难。

以上是关于Play Framework 1.2.4 在异步线程中同步作业:可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

heroku 部署与 play framework 1.2.4 和自己的安全模块

无法在 heroku 上使用 ClearDB 运行 Play Framework 1.2.4 应用程序

Play Framework 1.2.4 将项目导出/导入到 Eclipse IDE

如何在 Play Framework 1.2 中实现 HTTP Basic Auth?

Play Framework 2.0 中公共字段的使用

使用 play 1.2.4 框架发送电子邮件