Ваадин UI.access () в Tomcat 8.0.21 - PullRequest
0 голосов
/ 05 июня 2019

У меня следующий код работает должным образом при развертывании моего приложения в Tomcat 8.0.52:

button.addClickHandler(() -> {
    UI ui = UI.getCurrent();

    ui.access(() -> {
      spinner.setVisible(true);
    });
    ui.push();

    try
    {
      Thread.sleep(5000);           
    }
    catch (InterruptedException e)
    {
      LOG.error("", e)
    }  
    spinner.setVisible(false);
});

Runnable, присвоенное ui.access(), показывает счетчик, а через 5 секунд счетчикскрыто.

При развертывании приложения в Tomcat 8.0.21 Runnable не выполняется, поскольку счетчик не отображается.

Мой пользовательский интерфейс помечен @Push(value = PushMode.MANUAL, transport = Transport.WEBSOCKET_XHR)

Push работает нормально в обеих версиях Tomcat, проблема в методе access() UI.

Есть идеи о том, почему ui.access() не работает в Tomcat 8.0.21?

1 Ответ

1 голос
/ 06 июня 2019

То, как написан ваш пример кода, не должно работать.Если он работает, то он работает только случайно из-за того, что что-то не работает должным образом.

Независимо от того, какую версию Tomcat вы используете, ui.push() будет запускать задачу, которая была запланирована с использованием ui.access(),Вы можете подтвердить это, установив точку останова или заставив обратный вызов распечатать что-то в журнал.Разница между двумя версиями Tomat, скорее всего, связана с тем, как в противном случае ui.push() ведет себя при запуске непосредственно в обработчике кликов.

ui.push() предполагается использовать изнутри ui.access() задач, которые выполняются вфоновые потоки для немедленной отправки ожидающих изменений клиенту.В этом случае метод вызывается не из фонового потока, а из потока запроса (т.е. обработчик щелчка).Кроме того, сон в потоке запроса также проблематичен по многим другим причинам.

Вместо этого структура вашего кода должна напрямую устанавливать счетчик как видимый, а затем планировать поток или таймер для выполнения остальной части работы.и наконец вернемся с нетерпением из обработчика кликов.Затем нить или таймер должны использовать ui.access() для сокрытия счетчика.Использование ui.push() не требуется, если вы используете стандартный автоматический режим push вместо PushMode.MANUAL.

...