Почему onAttach запускается дважды под Tomcat, но только один раз под Jetty в веб-приложении Vaadin Flow 11? - PullRequest
0 голосов
/ 04 ноября 2018

Я взял данное приложение Vaadin 11.0.1 Base Starter и просто добавил переопределение метода onAttach. Этот метод вызывается подсистемой Vaadin, когда ваш компонент подключен к экрану. Итак, если приложение запускается один раз, мы должны увидеть, что этот метод вызывается один раз.

package com.basilbourque.example;

import com.vaadin.flow.component.AttachEvent;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.Route;

/**
 * The main view contains a button and a click listener.
 */
@Route ( "" )
public class MainView extends VerticalLayout {

    public MainView () {
        Button button = new Button( "Click me" ,
            event -> Notification.show( "Clicked!" ) );
        add( button );
    }

    @Override
    protected void onAttach ( AttachEvent attachEvent ){
        System.out.println( "onAttach running for `MainView` class. attachEvent.toString(): " + attachEvent + ". System.identityHashCode(this): " + System.identityHashCode(this));
    }
}

При запуске со стандартным веб-контейнером Jetty я вижу:

onAttach работает для MainView класса. attachEvent.toString (): com.vaadin.flow.component.AttachEvent [source=com.basilbourque.example.MainView@454ff330]. System.identityHashCode (this): 1162867504

Но когда я запускаю внешнюю версию Tomcat 9.0.12 для вызова IntelliJ Ultimate, версия 2018.3, я вижу следующее:

onAttach работает для MainView класса. attachEvent.toString (): com.vaadin.flow.component.AttachEvent [source=com.basilbourque.example.MainView@21b91e99]. System.identityHashCode (this): 565780121

onAttach работает для MainView класса. attachEvent.toString (): com.vaadin.flow.component.AttachEvent [source=com.basilbourque.example.MainView@5ee75022]. System.identityHashCode (this): 1592217634

Обратите внимание, что хэш идентификатора в конце обоих выходов отличается. Похоже, я получаю два экземпляра MainView, созданных несмотря на то, что у меня только один пользователь (одна страница автоматически открывается IntelliJ в браузере после развертывания и запуска Tomcat).

➥ Почему onAttach работает дважды на внешнем Tomcat, но только один раз на внутреннем Jetty?

Возможно, относится к этому Вопросу и к этому Вопросу ?


Еще страннее ... Если я изменю Application context IntelliJ Run/Debug Configuration (на 2-ой вкладке Deployment) с /bogus_war_exploded на /, то получу три экземпляра MainView работает.

onAttach работает для MainView класса. attachEvent.toString (): com.vaadin.flow.component.AttachEvent [source=com.basilbourque.example.MainView@4664fd83]. System.identityHashCode (this): 1181023619

onAttach работает для MainView класса. attachEvent.toString (): com.vaadin.flow.component.AttachEvent [source=com.basilbourque.example.MainView@2390403]. System.identityHashCode (this): 37291011

onAttach работает для MainView класса. attachEvent.toString (): com.vaadin.flow.component.AttachEvent [source=com.basilbourque.example.MainView@461aa7e4]. System.identityHashCode (this): 1176152036

Еще больше странностей ... Если я отключаю функцию автоматического открытия URL-адреса моего приложения Tomcat в веб-браузере при развертывании, то есть если я сниму флажок After launch в разделе Open browser первой вкладки Server в Run/Debug Configurations, тогда я получаю только один экземпляр MainView, как и ожидалось. Я должен вручную открыть страницу в браузере и вставить URL http://localhost:8080/bogus_war_exploded. Да, успехов!

Но что здесь происходит? Есть ли ошибка, связанная с автоматическим открытием IntelliJ URL в браузере? Если это так, я полагаю, что обходной путь - это вручную открыть браузер и URL. Или что-то еще происходит?


По иронии судьбы, я перестал использовать NetBeans и купил IntelliJ, чтобы избежать такого же ошибочного поведения. См. Переполнение стека, Tomcat, дважды развертывающее одно и то же приложение в NetBeans .


Я использую:

  • IntelliJ Ultimate edition 2018.3
  • Java 10.0.2 через Zulu JVM от Azul Systems (на основе OpenJDK)
  • Tomcat 9.0.12
  • Причал 9.4.11.v20180605
  • Проект создан из Base Starter
  • Ваадин 11.0.1
  • macOS High Sierra
  • MacBook Pro (Retina, 15-дюймовый, конец 2013 г.), 16 ГБ памяти.
...