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 большую часть времени он выполняется асинхронно, но не всегда.
Есть ли кто-нибудь, кто испытал подобное поведение и заставил его работать?
Спасибо