playframework - 如何等待一个超时的 Promise?

标签 playframework playframework-1.x

我想,下面的内容将永远等待着。如何指定超时?

await(new Job<Long>() {
    @Override
    public Long doJobWithResult() throws Exception {
        ...
    }
}.now());

最佳答案

实现杀死线程的超时实际上是一件相当困难的事情,因为您需要使用 Thread.stop() 或其他可怕的东西,当它死亡时可能无法清理。更好的方法是在长时间作业中设置超时标志,使其停止处理并更快返回。或者,您可以让长时间的工作继续进行,并在超时时做出响应。

这是一个可以满足您要求的测试用例:

https://github.com/playframework/play/blob/1.3.x/samples-and-tests/just-test-cases/app/controllers/WithContinuations.java#L73

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!");
    }

关于playframework - 如何等待一个超时的 Promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14506979/

相关文章:

playframework - 在 Play Framework 2.2 中使用非异步操作有什么好处吗?

html - HTML 模板中的 playframework JsValue

playframework - Play 框架 2.3 dist 任务 - javascripts-min 不可用

java - 玩!框架使用 <lot> 的静态变量

java - Spring:创建模拟而不是真实对象

playframework - Log4j 自定义配置以分隔每个级别的日志 - Playframework 1.2.5

mysql - 与 Amazon RDS MySQL & Play Framework 1.2.5(c3p0 默认设置)的连接偶尔挂起

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

mysql - 如何在单个数据库事务中允许数据截断?

java - 在游戏框架中编写功能测试的正确方法