Encadeando em um servidor de aplicativos

Eu tenho um programa / thread Java que eu quero implantar em um servidor de aplicativos (GlassFish). O encadeamento deve ser executado como um “serviço” que inicia quando o Servidor de Aplicativos é iniciado e pára quando o Servidor de Aplicativos é fechado.

Como eu iria fazer isso? Não é realmente um Session Bean ou MDB. É só um fio.

Eu só fiz isso com o Tomcat, mas deve funcionar no Glassfish.

Crie uma class Listener que implemente javax.servlet.ServletContextListener , em seguida, coloque-a em web.xml. Ele será notificado quando seu aplicativo da web for iniciado e destruído.

Uma class simples de ouvinte:

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

Isso vai no web.xml depois do seu último ‘parâmetro de contexto’ e antes do seu primeiro ‘servlet’:

  atis.Listener  

Não sei se esse tipo de coisa é recomendado ou não, mas funcionou bem para mim no passado.

Isso não é algo que você deve fazer em qualquer servidor de aplicativos, a menos que tenha access a segmentos gerenciados fornecidos pelo servidor de aplicativos. Eu não estou familiarizado com o Glassfish, mas você poderia fazer isso no Websphere ou no Weblogic usando um CommonJ WorkManager.

Aparentemente, o mesmo pode ser feito no Glassfish e no JBOSS através de um JCA WorkManager (que eu não conheço).

Crie um servlet cujo método init inicie um encadeamento, que é o programa principal.

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

No arquivo web.xml de nosso aplicativo, inclua um servlet que inclua um elemento load-on-startup, em que o número é a ordem em que ele é iniciado.

  Mail Sending Servlet MailServlet 2  

Eu também preciso criar vários segmentos onde cada thread irá abrir um soquete para outros processos remotos em execução no meu aplicativo Glassfish. Servidor. Eu olhei para o bean LifecycleListener fornecido pelo Glassfish que você precisa implementar.

Eu criei um protótipo para executar o trabalho de encadeamento e soquete na implementação do LifecycleListener e realmente não ajudou com o gerenciamento desses resources. Para obter access ao LifecycleListener eu tive que colocar um método estático público que executaria as ações desejadas.

Não vejo nenhum valor no LifecycleListener porque eu poderia ter executado exatamente o mesmo trabalho dentro do meu EJB, que é o cliente chamando o LifecycleListener. Porque realmente não existe um gerenciamento adequado do Thread e do Socket no bean.

Disseram-me que o JCA pode ser o melhor caminho a percorrer. Eu não tentei isso.

Eu inicio um object com tempo com o serviço de timer e apenas uma única expiração. Então, no tempo limite, faço o que queria fazer com o encadeamento.

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

Para mim, funcionou, pois usa componentes J2EE e é um thread diferente.

Intereting Posts