2009-02-10 16 views
12

Ho un programma/thread Java che desidero distribuire in un server applicazioni (GlassFish). Il thread deve essere eseguito come un "servizio" che viene avviato all'avvio e all'arresto del server delle applicazioni quando si chiude il server delle applicazioni.Threading in un server applicazioni

Come faccio a fare questo? Non è davvero un Session Bean o MDB. È solo un filo.

+0

Curiosità: perché è necessario iniziare una discussione? Mi fa sempre male quando devi avviare i thread in un AppServer ... – Guillaume

+0

Il thread deve eseguire un'istanza di HSQL DB Server – systemoutprintln

risposta

1

Creare un servlet il cui metodo init avvia una discussione che è il programma principale.

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

Nel file web.xml della nostra applicazione aggiungiamo una servlet che include un elemento di carico-on-startup in cui il numero è l'ordine in cui si comincia.

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

questo non è qualcosa che si dovrebbe fare in qualsiasi application server, a meno che non si ha accesso a thread gestiti forniti dal server app. Non ho familiarità con Glassfish, ma è possibile farlo in Websphere o Weblogic usando un WorkManager commonj.

Apparentemente, lo stesso può essere realizzato in Glassfish e JBOSS tramite un JCA WorkManager (che non ho familiarità con).

7

L'ho fatto solo con Tomcat, ma dovrebbe funzionare in Glassfish.

Creare una classe Listener che implementa javax.servlet.ServletContextListener, quindi inserirla in web.xml. Verrà notificato quando la tua app Web viene avviata e distrutta.

Una semplice classe 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(); 
     } 
    } 

} 

Questo va in web.xml dopo l'ultima 'context-param' e prima del primo 'servlet':

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

non so se questo tipo di cosa è raccomandato o no, ma ha funzionato bene per me in passato.

+0

Questo mi sembra molto più pulito del dirottamento di un metodo servlet.init(). Tuttavia, mi sento un po 'a disagio nell'iniziare i thread in un AppServer. – Guillaume

+0

+1 questo è l'era di farlo. se non sei sicuro della gestione del tuo thread, avvia il quarzo all'interno del server dell'app. ma fallo all'interno della SCL come descritto qui .. –

+0

Nice. Funziona su Glassfish 3 qui. –

0

Ho anche bisogno di creare più thread in cui ogni filo viene aperto un socket a un altro processi remoti in esecuzione nel mio Glassfish App. Server. Ho esaminato il bean LifecycleListener fornito da Glassfish che è necessario implementare.

Ho creato un prototipo per eseguire il lavoro di threading e socket nell'implementazione di LifecycleListener e in realtà non ha aiutato la gestione di queste risorse. Per accedere a LifecycleListener ho dovuto inserire un metodo statico pubblico pubblico che eseguisse le azioni desiderate.

Non vedo alcun valore in LifecycleListener perché avrei potuto eseguire esattamente lo stesso lavoro all'interno del mio EJB, che è il client che chiama LifecycleListener. Perché non c'è davvero una corretta gestione del Thread e Socket nel bean.

Mi è stato detto che JCA potrebbe essere il modo migliore per andare. Non ho provato questo.