Processamento paralelo na JEE com JBoss

7 respostas
danieldestro

Caros,

A espec. JEE não me permite usar threads para processamento paralelo.
Creio que uma solução seja usar filas JMS com MDB.

Mas como meu caso é bem simples, eu queria evitar de ter que usar JMS e MDB, pois só preciso de um ServletContextListener que executa algo. Esse algo é meio demorado e acaba travando o startup do Jboss ou do contexto.

Como essa minha implementação vai em diversos sistemas, na forma de um JAR, quero simplificar e fazer algo com processamento paralelo, tudo dentro de um jar, que pode ser usado dentro de cada app web, sem um precisar criar dependências externas ou mais complicadas.

O que sugerem?

7 Respostas

D

Olá.

Você não pode fazer o seu ServletContextListener disparar uma Thread não?!?!

Cria uma classe que extende Thread (ou implementa Runnable :D) e no listener você dá um thread.start() nessa classe que você criou! :slight_smile:

Bem… espero ter ajudado. Abraço.

agodinho

vc não queria dizer assíncrono não?

Woody

urubatan

danieldestro:
Caros,

A espec. JEE não me permite usar threads para processamento paralelo.
Creio que uma solução seja usar filas JMS com MDB.

Mas como meu caso é bem simples, eu queria evitar de ter que usar JMS e MDB, pois só preciso de um ServletContextListener que executa algo. Esse algo é meio demorado e acaba travando o startup do Jboss ou do contexto.

Como essa minha implementação vai em diversos sistemas, na forma de um JAR, quero simplificar e fazer algo com processamento paralelo, tudo dentro de um jar, que pode ser usado dentro de cada app web, sem um precisar criar dependências externas ou mais complicadas.

O que sugerem?


de dentro do listener tu pode usar threads, de dentro de um request de um servlet que não pode pela especificação :smiley:

danieldestro

Bom saber… e vc sabe o pq pode em um e nao em outro?

urubatan

Bom saber… e vc sabe o pq pode em um e nao em outro?
o listener starta na “thread principal” da tua aplicação.

a resposta a um request roda dentro de uma thread criada só pra isto, por isto o tratamento das duas coisas é diferente.

por exemplo, se tu colocar um sleep dentro de um ServletContextListener, o servidor vai parar o startup dele e ficar esperando a volta do teu sleep para continuar o processamento.
se tu fizer a mesma coisa dentro de um metodo “doGet” por exemplo, ele não vai travar.

o “não pode criar threads” vem do pressuposto de que o container vai criar uma thread para atender a cada request dos usuários, e ele tem que cuidar do ciclo de vida destes threads, como tu não deve trancar um thread destes, para tentar sincronizar com o teu, se tu criar um thread ali dentro este ficaria perdido …

é só este o problema.

danieldestro

Resolvido com as classes java.util.Timer e java.util.TimerTask.
Me parece melhor que usar Threads.

louds

danieldestro:
Resolvido com as classes java.util.Timer e java.util.TimerTask.
Me parece melhor que usar Threads.

Que internamente usam threads. :wink:
Se o teu servidor de aplicação suportar a spec commonj, já tem um WorkManager que te permite realizar processamento assíncrono usando threads gerenciadas pelo container.

Criado 30 de março de 2006
Ultima resposta 4 de abr. de 2006
Respostas 7
Participantes 5