vaadin 프레임 워크 내에서 push를 사용하여 화면을 업데이트하는 코드를 호출하려고합니다. 그러나 프로세스가 너무 오래 걸릴 수 있기를 원합니다. 그것을 취소하십시오.SimpleTimeLimiter (Guava)를 Vaadin과 함께 사용하는 방법
내가 구아바의 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 작업을 죽일 수있는 방법을 찾을 수 없습니다. 즉, 공용 Void 호출 메서드에서 UI.getCurrent(). access()를 실행하여 표시되는 방식 대신 실행했습니다. 같은 결과 였지만 TimeoutException이 있더라도 access()가 계속되었습니다. –
@StephaneGrenier 주제에 대해 더 많은 것을 가지고 나의 답변을 업데이트 + 더 나은 예제 프로젝트를 만들었습니다 :) – Mika
자세한 예제와 샘플 코드를 보내 주셔서 감사합니다. 정말 고맙습니다. 제 관심사는 코드와 구아바의 SimpleTimeLimiter의 차이점은 무엇입니까? 바퀴의 많은 발명품이 있습니까? 내가 코드를 정확히 이해한다면 기본적으로 인터럽트 시간이 있는지 폴링하고있는 것입니까? –