2016-09-22 43 views
8

W kontekście aplikacji Java EE 6 uruchamianej w produkcie WebSphere 8.0, należy wykonać wiele zadań uruchamiania przed wykonaniem dowolnej metody biznesowej. Używanie do tego celu fasoli @Startup @Singleton wydaje się obiecującym rozwiązaniem. Jednak nie jest dla mnie całkowicie jasne, jak dokładnie będzie wyglądać cykl życia aplikacji. W EJB 3.1 spec stwierdza co następuje:Metoda @Singleton @Startup @PostConstruct gwarantuje powrót przed udostępnieniem EJB dla połączeń klienta?

Domyślnie pojemnik jest odpowiedzialny za podejmowanie decyzji, kiedy zainicjować Singleton instancji fasoli. Jednak programista fasoli może opcjonalnie skonfigurować Singleton do szybkiej inicjalizacji. Jeśli adnotacja startowa pojawia się w klasie komponentu bean Singleton lub jeśli oznaczenie wdrożenia Singleton zostało oznaczone jako wymagające szybkiej inicjalizacji, kontener musi zainicjować instancję bean pojedynczej Singleton podczas sekwencji uruchamiania aplikacji. Kontener musi inicjować wszystkie takie Singletony czasu uruchamiania przed wszelkie żądania klientów są dostarczane do komponentów komponentu EJB w aplikacji .

  1. W ostatnim zdaniu, co dokładnie stanowi "inicjalizacji"? Czy kontener będzie czekał na zwrócenie metody @PostConstruct komponentu bean @Startup, zanim udostępni komponenty przedsiębiorstwa do żądań klientów?

  2. Mówiąc o "żądaniach klienta", należy zaplanować wykonanie metody EJB z adnotacją @Scheduled jako taką w tym kontekście?

muszę zagwarantować, że niektóre kod jest wykonywany przy starcie aplikacji, zanim którykolwiek z metod biznesowych w dowolnym z różnych komponentów EJB w aplikacji można uruchomić, czy to za pośrednictwem połączeń klienckich lub zaplanowane egzekucje. Czy uruchomienie kodu startowego w metodzie @PostConstruct komponentu @Singleton @Startup zapewnia taką gwarancję? Jeśli nie, czy jest jakiś inny sposób na zagwarantowanie takiego zachowania?

+0

Cóż, z pewnością nie byłoby dobrze, gdyby serwer aplikacji serwował fasolę, która nadal jest w trakcie wykonywania metod '@ PostConstruct'. – Kayaman

+1

@Kayaman Istnieje różnica między serwowaniem fasoli w środku ich metod '@ PostConstruct' i blokowaniem wywołań do * wszystkich * fasoli, podczas gdy * any *' @ Startup' bean jest w metodzie '@ PostConstruct', co jest zachowaniem wymagane przez specyfikację. –

+0

@BrettKail Rzeczywiście istnieje. Te ostatnie gwarantują, że ten pierwszy nie może się zdarzyć. Jednak, ponieważ jego cytat nie wymienił wyraźnie "@ PostConstruct", uważam, że zastanawiał się, czy '@ PostConstruct' jest częścią inicjalizacji czy nie. – Kayaman

Odpowiedz

6
  1. Tak, czeka kontenerów metody @PostConstruct wszystkich @Startup fasoli w module („aplikacji EJB”), aby wrócić przed zezwoleniem żadnych żądań klientów.
  2. Tak, jest tak w przypadku serwera WebSphere Application Server, co sugeruje temat Developing singleton session beans w Centrum Wiedzy, który mówi: "Metoda PostConstruct w pojedynczym komponencie bean może utworzyć zegar EJB [...] Jednak, aby uniknąć zakleszczenia , metoda PostConstruct nie może czekać na uruchomienie timera EJB ". Innymi słowy, wywołania oddzwaniania z opóźnieniem oczekują na zakończenie metod @PostConstruct, więc metody nie mogą czekać na zakończenie wywołań oddzwaniania timerem.
+0

Tego właśnie szukałem. Dzięki! –