使用Play框架进行异步轮询

时间:2014-07-15 02:36:32

标签: java playframework-2.0

如何在Play中异步轮询函数?

我需要做什么:

  1. 客户请求播放应用程序。
  2. 播放应用程序会定期检查功能。
  3. 如果函数返回true,则立即返回请求,否则稍后再次轮询该函数。
  4. 到目前为止我得到了什么:

    // Controller
    public class Application extends Controller {
        // Action
        public static Promise<Result> startPoll(String id) {
            Promise<Boolean> pollPromise = poller(id);
            Promise<Result> resultPromise = pollPromise.map(pollResult -> ok(pollResult));
            return resultPromise;
        }
    
        private static Promise<Boolean> poller(String id) {
            // TODO How do you poll a function with promise of a boolean?
        }
    }
    

    轮询不应阻止其他类似的请求完成。

2 个答案:

答案 0 :(得分:1)

您可以使用以下递归函数解决此问题:
1)当轮询函数返回“就绪”时返回true 2)当轮询函数返回“未准备好”时,返回一个稍后检查的承诺

示例:

在Controller类中:

public Promise<boolean> processRequest() {
    Task t = new Task;
    t.startTask();
    return taskPoller(t);
}

private Promise<Boolean> taskPoller(Task t) {
    if (t.isDone()) {
        return Promise.promise(()->true);
    } else {
        Promise<Boolean> p = Promise.timeout(true, 100); //100 milliseconds
        return p.map((result) -> taskPoller(t));
    }
}

答案 1 :(得分:0)

您将需要查看WebSockets或使客户端通过ajax轮询服务器。 See Here