Как динамически обновлять страницы в vaadin?

#java #spring #vaadin #vaadin-push

#java #весна #vaadin #vaadin-push

Вопрос:

У меня есть рабочее приложение с Vaadin и Spring ( Security) . Сейчас я пытаюсь динамически отправлять обновления в клиентские интерфейсы с помощью vaadin-push .

Я хочу создать «представление», одинаковое для всех клиентов. Представление должно получать счетчик, динамически увеличиваемый нажатием. Итак, пока клиенты отображают страницу, счетчик обновляется сам (или в моем примере: добавляет на страницу несколько компонентов label). Каждый клиент должен видеть одно и то же значение.

Но я не вижу изменений, перенесенных на веб-страницу. Почему?

 //the static controller the dynamically changes content
@Controller
public class ViewPresenter {
    private static int counter = 0;

    @Autowired
    private void StaticView view;

    @Scheduled(fixedRate = 1000)
    public void refresh() {
        //push the content change periodically to frontend
        view.getUI().access(new Runnable() {
            @Override
            public void run() {
                view.addComponent(new Label("refresh: "   counter  );
                Sysout("update executed: "   counter); //OK, is printed
            }
        });
    }
}

//the static test component that gets a new label added on every content change
@VaadinComponent
public class StaticView extends CssLayout {
        //this is the view that every client should see
}

//the secured admin view
@VaadinView(name = "/secured")
@Scope("ui")
@Secured("user")
public class SecuredView extends VerticalLayout implements View {
    @Autowired
    private StaticView staticView;

    @Override
    public void enter(ViewChangeEvent event) {
        addComponent(staticView);
    }
}

//enable push
@Configuration
@Push
public class AppConfig {
}

@VaadinUI
@PreserveOnRefresh
public class ApplicationUI extends UI {

} 
  

Я могу видеть изменения на стороне клиента, только если я вручную обновлю веб-страницу. Но само содержимое не изменяется автоматически.

Может @Push быть, нужно поместить в UI класс? Но в этом случае я получу следующую ошибку:

java.lang.Исключение IllegalStateException: невозможно приостановить ответ дольше, чем время ожидания сеанса. Увеличьте значение времени ожидания сеанса в web.xml в org.atmosphere.cpr.AtmosphereResourceImpl.suspend(AtmosphereResourceImpl.java:314) в org.atmosphere.cpr.AtmosphereResourceImpl.suspend(AtmosphereResourceImpl.java:292) в com.vaadin.server.communication.PushHandler $ 2.запустите (PushHandler.java:129) в com.vaadin.server.communication.PushHandler.callWithUi(PushHandler.java:242) в com.vaadin.server.communication.PushHandler.access$ 200(PushHandler.java:55) на com.vaadin.server.communication.PushHandler $1.onRequest(PushHandler.java:73)

Ответ №1:

Решение, основанное на https://github.com/peholmst/vaadin4spring/issues/51#issuecomment-46875255:

server.sessionTimeout=30 с помощью @Push(transport = Transport.LONG_POLLING)