2

以下は永遠に待っていると思います。タイムアウトを指定するにはどうすればよいですか?

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

2 に答える 2

3

スレッドを強制終了するタイムアウトを実装することは、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!");
    }
于 2013-01-25T18:30:33.297 に答える
-1

アクションの前の時間を指定します。したがって、30秒のタイムアウトの場合:

await("30s", new Job<Long>() {
    @Override
    public Long doJobWithResult() throws Exception {
        ...
    }
}.now());
于 2013-01-24T21:47:08.293 に答える