Playframework 如何等待一个超时的承诺?

Playframework 如何等待一个超时的承诺?,playframework,playframework-1.x,Playframework,Playframework 1.x,我想,下面的故事将永远在等待。如何指定超时 await(new Job<Long>() { @Override public Long doJobWithResult() throws Exception { ... } }.now()); 等待(新作业(){ @凌驾 public Long doJobWithResult()引发异常{ ... } }.now()); 指定操作前的时间。因此,对于30秒超时: await("30s", new

我想,下面的故事将永远在等待。如何指定超时

await(new Job<Long>() {
    @Override
    public Long doJobWithResult() throws Exception {
        ...
    }
}.now());
等待(新作业(){ @凌驾 public Long doJobWithResult()引发异常{ ... } }.now());
指定操作前的时间。因此,对于30秒超时:

await("30s", new Job<Long>() {
    @Override
    public Long doJobWithResult() throws Exception {
        ...
    }
}.now());
等待(“30秒”,新工作(){ @凌驾 public Long doJobWithResult()引发异常{ ... } }.now());
一般来说,实现超时杀死线程实际上是一件非常困难的事情,因为您需要使用thread.stop()或其他一些可怕的东西,这些东西在线程死后可能无法清理。更好的方法是在长作业中设置超时标志,使其停止处理并更快返回。或者,让长作业继续,并在超时时仅呈现响应

下面是一个满足您需求的测试用例:

publicstaticvoidwaitwithtimeout(){
Promise task1=新工作。DoSomething(100).now();
Promise task2=新工作。DoSomething(2000).now();
r=wait(Promise.waitor(Promise.waitAll(task1,task2),Timeout(300));
用于(超时t:r.\u 2){
StringBuilder结果=新建StringBuilder();
if(task1.isDone()){
追加(“+Task1->”+Task1.getOrNull());
}
if(task2.isDone()){
result.append(“+Task2->”+Task2.getOrNull());
}
renderText(“超时!部分结果为”+结果);
}
renderText(“失败!”);
}

在播放1.2.4-mbknor3时不编译。这是在游戏1.2.5中添加的吗?你确定它编译好了吗?是的,糟糕-看看其他答案。不-其他答案也不起作用。有兴趣了解您的想法,请将此方法
await()
所属的包和类发回给我们。它是控制器类的一部分-但您不容易在src中找到它-它是play1的类加载器voodoo的一部分。详情如下:
public static void waitWithTimeout() {
        Promise<String> task1 = new jobs.DoSomething(100).now();
        Promise<String> task2 = new jobs.DoSomething(2000).now();
        Either<List<String>,Timeout> r = await(Promise.waitEither(Promise.waitAll(task1, task2), Timeout(300)));

        for(Timeout t : r._2) {

            StringBuilder result = new StringBuilder();

            if(task1.isDone()) {
                result.append(" + Task1 -> " + task1.getOrNull());
            }

            if(task2.isDone()) {
                result.append(" + Task2 -> " + task2.getOrNull());
            }

            renderText("Timeout! Partial result is " + result);
        }

        renderText("Fail!");
    }