tipo servidores servidor desplegar crear configurar como aplicaciones aplicacion java multithreading glassfish ejb application-server

java - servidores - servidor de aplicaciones pdf



Enhebrado en un servidor de aplicaciones (6)

Tengo un programa / subproceso de Java que deseo implementar en un servidor de aplicaciones (GlassFish). El hilo debe ejecutarse como un "servicio" que se inicia cuando el servidor de aplicaciones se inicia y se detiene cuando se cierra el servidor de aplicaciones.

¿Cómo voy a hacer esto? No es realmente un Session Bean o MDB. Es solo un hilo.


Cree un servlet cuyo método init comience un hilo que es el programa principal.

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

En el archivo web.xml de nuestra aplicación, agregue un servlet que incluya un elemento load-on-startup donde el número es el orden en que se inicia.

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


Esto no es algo que deba hacer en ningún servidor de aplicaciones, a menos que tenga acceso a subprocesos administrados proporcionados por el servidor de la aplicación. No estoy familiarizado con Glassfish, pero puedes hacerlo en Websphere o Weblogic usando Commonj WorkManager.

Aparentemente, lo mismo se puede lograr en Glassfish y JBOSS a través de un JCA WorkManager (con el que no estoy familiarizado).


También necesito crear varios hilos donde cada hilo abrirá un socket a otros procesos remotos que se ejecutan en mi aplicación Glassfish. Servidor. Analicé el bean LifecycleListener provisto por Glassfish que necesita implementar.

Creé un prototipo para realizar el trabajo de enhebrado y socket en la implementación de LifecycleListener y realmente no ayudó con la gestión de estos recursos. Para tener acceso al LifecycleListener tuve que poner un método público estático que ejecutara las acciones deseadas.

No veo valor en LifecycleListener porque podría haber realizado exactamente el mismo trabajo dentro de mi EJB, que es el cliente que llama al LifecycleListener. Porque realmente no hay una gestión adecuada del hilo y el zócalo en el grano.

Me dijeron que JCA puede ser la mejor manera de hacerlo. No he intentado esto.


Empiezo un objeto temporizado con el servicio del temporizador y solo un solo vencimiento. Luego, en el tiempo de espera, hago lo que quería hacer con el hilo.

http://onjava.com/pub/a/onjava/2004/10/13/j2ee-timers.html

Para mí funcionó ya que usa componentes J2EE y es un hilo diferente.



Solo he hecho esto con Tomcat, pero debería funcionar en Glassfish.

Cree una clase Listener que implemente javax.servlet.ServletContextListener , luego póngalo en web.xml. Se le notificará cuando su aplicación web se inicie y se destruya.

Una clase simple de Oyente:

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

Esto va en web.xml después de su último ''parámetro de contexto'' y antes de su primer ''servlet'':

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

No sé si este tipo de cosas se recomienda o no, pero me funcionó en el pasado.