Vaadin 8 Push иногда синхронный

У нас есть приложение Vaadin 8, использующее функцию @Push для передачи данных в пользовательский интерфейс, который должен загружаться асинхронно.

Чтобы загрузить данные, мы создаем Runnable, который выполняется в Executor, а затем выполняет обратный вызов функции в UI/View, где этот код вызывается:

UI ui = getUI();
if (!isAttached() || ui.getSession().hasLock()) {
    MainViewComponentImpl.this.componentImpl.getSomeComponent().setVisible(true);
    MainViewComponentImpl.this.componentImpl.getSomeComponent().setItems(someHashMap.keySet());
} else {
    ui.access(new Runnable() {
        @Override
        public void run() {
            MainViewComponentImpl.this.componentImpl.getSomeComponent().setVisible(true);
            MainViewComponentImpl.this.componentImpl.getSomeComponent().setItems(someHashMap.keySet());
        }
    });
}

Если Runnable, куда загружаются данные, имеет Thread.sleep(TimeUnit.SECONDS.toMillis(15)) перед обратным вызовом данные фактически асинхронно помещаются в пользовательский интерфейс, но если это не так, пользовательский интерфейс зависает и загружает все это вместе.

Моим первым впечатлением было то, что if/else проверяет, загружается ли пользовательский интерфейс, и может ли он добавить данные к текущей загрузке, но даже если мы раскомментируем условие if и всегда будем использовать метод ui.access() данные загружаются синхронно. Кроме того, даже с использованием Timeout он сильно зависит от сборки, независимо от того, действительно ли данные загружаются асинхронно. После обновления maven, очистки проекта и сборки maven большую часть времени он выполняется асинхронно, но не всегда.

Есть ли кто-нибудь, кто испытал подобное поведение и заставил его работать?

Спасибо

0 ответов

Другие вопросы по тегам