マーク:
Javaの1.8を使用してイムは、私のAPIのための変曲1.0.13を1.3.5をdropwizard、および闊歩。
私は、HTTPリクエストを受け取るメソッドを持っている20秒を遅延させ、その後、200のステータスコード応答を返します。
public ResponseContext delayBy20Seconds(RequestContext context) {
ResponseContext response = new ResponseContext().contentType(MediaType.APPLICATION_JSON_TYPE);
Thread.sleep(20000);
response.status(Response.Status.OK);
return response;
}
私は(この場合は20秒かかります)操作は、15秒以上かかる場合は400のステータスコードを返すようにしたいと言います。私はこれをどのように実現するのでしょうか?
coladict:
追加のライブラリなしでそれを行うための1つの方法は、使用しているjava.util.concurrent
パッケージを。このような長時間実行中のタスクをキャンセルする最も確実な方法は、別のスレッドでそれを実行することです。
import java.util.concurrent.*;
...
private ExecutorService exec = Executors.newSingleThreadExecutor();
public ResponseContext delayBy20Seconds(RequestContext context) {
Callable<ResponseContext> task = new Callable<ResponseContext>() {
@Override
public ResponseContext call() throws Exception {
Thread.sleep(20000);
return new ResponseContext().contentType(MediaType.APPLICATION_JSON_TYPE);
}
};
List<Callable<ResponseContext>> tasks = new ArrayList<>();
tasks.add(task);
List<Future<ResponseContext>> done = exec.invokeAll(tasks, 15, TimeUnit.SECONDS);
Future<ResponseContext> task1 = done.get(0);
if (task1.isCancelled()) {
return some Error Response;
}
return task1.get();
}
あなたは、ExecutorService
あなたは、この特定の使用のためのスレッド間でそれを共有したくないので、静的であってはなりません。
Callable<ResponseContext>
長時間実行中のタスクのための作業が行われているところ実装です。それはで明らかであるようとexec.invokeAll
コール私たちは待って喜んでいるどのくらいを教えてください。先物のリストはとても空虚のためにそれをチェックする必要はありません、常にタスクのリストなど、多くの要素として含まれています返されました。私達はちょうど、タスクが完了していないかどうかをチェックする必要があります。