2009-02-10 10 views
12

Mam program/wątek Java, który chcę wdrożyć na serwerze aplikacji (GlassFish). Wątek powinien działać jako "usługa", która rozpoczyna się po uruchomieniu i zatrzymaniu serwera aplikacji po zamknięciu serwera aplikacji.Nawlekanie w serwerze aplikacji

Jak miałbym to zrobić? To nie jest tak naprawdę Session Bean ani MDB. To tylko wątek.

+0

Ciekawość: dlaczego trzeba rozpocząć wątek? Zawsze jest mi źle, gdy trzeba uruchomić wątki w AppServerze ... – Guillaume

+0

Wątek uruchamia wystąpienie serwera bazy danych HSQL – systemoutprintln

Odpowiedz

1

Utwórz serwlet, którego metoda init uruchamia wątek będący programem głównym.

public void init() throws ServletException { 
    mailThread = new MailSendThread(); 
    mailThread.start(); 
} 

W pliku web.xml naszej aplikacji dodać aplet, który zawiera element load-on-startup gdzie liczba jest kolejność, w jakiej to się zaczyna.

<servlet> 
    <servlet-name>Mail Sending Servlet</servlet-name> 
    <servlet-class>MailServlet</servlet-class> 
    <load-on-startup>2</load-on-startup> 
</servlet> 
3

To nie jest coś, co należy zrobić na dowolnym serwerze aplikacji, chyba że masz dostęp do zarządzanych wątków dostarczanych przez serwer aplikacji. Nie jestem zaznajomiony z Glassfish, ale można to zrobić w Websphere lub Weblogic przy użyciu commonj WorkManager.

Podobno można to zrobić w Glassfish i JBOSS za pośrednictwem WorkManager JCA (którego nie znam).

7

Zrobiłem to tylko z Tomcat, ale powinno działać w Glassfish.

Utwórz klasę nasłuchującą implementującą javax.servlet.ServletContextListener, a następnie umieść ją w pliku web.xml. Zostanie powiadomiony, gdy twoja aplikacja internetowa zostanie uruchomiona i zniszczona.

Prosta klasa Listener:

public class Listener implements javax.servlet.ServletContextListener { 

    MyThread myThread; 

    public void contextInitialized(ServletContextEvent sce) { 
     myThread = new MyThread(); 
     myThread.start(); 
    } 

    public void contextDestroyed(ServletContextEvent sce) { 
     if (myThread != null) { 
      myThread.setStop(true); 
      myThread.interrupt(); 
     } 
    } 

} 

To idzie w web.xml po ostatnim 'Context-param' i przed pierwszym 'servlet':

<listener> 
    <listener-class>atis.Listener</listener-class> 
</listener> 

nie wiem, czy tego rodzaju rzeczy są zalecane lub nie, ale w przeszłości działało dobrze dla mnie.

+0

Wydaje mi się to znacznie czystsze niż przejęcie metody servlet.init(). Mimo to czuję się trochę niekomfortowo z uruchamianiem wątków w AppServer. – Guillaume

+0

+1 to było to zrobić. jeśli nie masz nic przeciwko zarządzaniu własnym wątkiem ... uruchom kwarc wewnątrz serwera aplikacji. ale zrób to wewnątrz SCL, jak to tutaj opisano .. –

+0

Nice. Działa na Glassfish 3 tutaj. –

0

ja też trzeba utworzyć kilka wątków, gdzie każdy wątek będzie otworzyć gniazda do innego pilota procesów uruchomionych w moim GlassFish App. Serwer. Zajrzałem do fasoli LifecycleListener dostarczonej przez Glassfish, którą musisz zaimplementować.

Stworzyłem prototyp do wykonywania wątków i pracy z gniazdami w implementacji LifecycleListener i nie pomogło to w zarządzaniu tymi zasobami. Aby uzyskać dostęp do LifecycleListener musiałem umieścić publiczną metodę statyczną , która wykonywałaby pożądane działania.

Nie widzę żadnej wartości w LifecycleListener, ponieważ mógłbym wykonać dokładnie tę samą pracę wewnątrz mojego EJB, który jest klientem wywołującym LifecycleListener. Ponieważ tak naprawdę nie ma właściwego zarządzania wątkiem i gniazdem w fasoli.

Powiedziano mi, że JCA może być najlepszą drogą. Nie próbowałem tego.

Powiązane problemy