私はvaadinフレームワーク内でいくつかのコードを呼び出そうとしていますが、これは長時間実行されているためプッシュで画面を更新しますが、それをキャンセルしてください。VaadinでSimpleTimeLimiter(Guava)を使用する方法
グアバのSimpleTimeLimiter
クラスを使用しようとしていますが、何をしてもVaadinプロセスが停止しないように見えません。私はSimpleTimeLimiter
をUI.getCurrent().access()
メソッドの内側と外側の両方に入れようと試みましたが、SimpleTimeLimiter
がTimeoutException
を投げたとしても、それらは両方ともプロセスを実行し続けます。私は、通常のスレッドと同じコードを使用している場合しかし、この方法は1秒以上かかる場合、それはTimeoutException
を投げると、通知ウィンドウをお付けいたします上記のコードでは...
public static void limitExecutionTime(Consumer<UI> lambda)
{
UI currentUI = UI.getCurrent();
UI.getCurrent().access(() ->
{
try
{
SimpleTimeLimiter.create(Executors.newSingleThreadExecutor()).callWithTimeout(new Callable<Void>()
{
@Override
public Void call()
{
// This is needed to deal how Vaadin 8 handles UI's
UI.setCurrent(currentUI);
lambda.accept();
return null;
}
}, 1, TimeUnit.SECONDS);
} catch (TimeoutException | InterruptedException | ExecutionException e) {
NotificationUtils.showError("Execution took beyond the maximum allowed time.");
currentUI.push();
}
});
}
を動作するようです。しかし、それはラムダを実行し続けます。私は反対のことを実行しようとしましたとpublic Void call()
方法でUI.getCurrent().access()
を置くが、これは正確に同じ結果を持っていた結果
UI.access
を呼び出す必要があります
私はそれを試みましたが、うまくいきませんでした。基本的に私は時間のx量後にUI.accessタスクを殺す方法を見つけることができません。つまり、表示されている方法ではなく、public Void呼び出しメソッドでUI.getCurrent()。access()を実行しました。同じ結果でしたが、TimeoutExceptionがあったとしてもaccess()は続きました。 –
@StephaneGrenierトピック+についてより多くの回答を更新しました。より良いサンプルプロジェクトを作成しました:) – Mika
詳細なサンプルとサンプルコードをありがとう、本当にありがとうございます。私が心配しているのは、コードとGuavaのSimpleTimeLimiterの違いは何ですか?車輪の再発明はたくさんありますか?私があなたのコードを正しく理解していれば、基本的にポーリングして割り込みの時間があるかどうかを確認していますか? –