Ajuda com Threads em projeto web

Fala Galera, seguinte, tenho um projeto web em que o usuário envia um arquivo e após isso é executado um processamento nesse arquivo.
Problema: O usuário deve esperar apenas o tempo de upload do arquivo, ou seja, o processamento deveria ser executado em Background. Eu sei que da pra fazer isso com o conceito de Thread-deamon, más to meio perdido pra comecar…
…:Eu estou usando o Vraptor, e no meu controller tem uma lógica chamada execute() que faz o processamento (Chamando uma Stored Procedure), essa lógica ou só o miolo dela que eu quero executar em Background…

Alguem tem alguma idéia?
Desde já agradeço.
[]s!
Leonardo Gloria

Já pensou em usar MDB para isso?

MDB = ?

[]s!
Leonardo Gloria

Thread-daemon???

Qual o problema em usar uma Thread convencional? Voce quer saber como criar uma thread em Java? É isso?

Esta sugerindo que ele use um AppServer com suporte a EJB só pra processar algo em background? :shock:

IMHO, se você estiver rodando a tua aplicação num AppServe completo (JBoss, Glassfish, Weblogic, etc), vale a pena utilizar JMS para processamentos assincronos. Não é uma boa prática criar Threads em aplicações web.

JMS é uma coisa que talvez dê um pouco de dor de cabeça pra configuração inicial, entendimento, etc, mas depois fica fácil adicionar novas filas de processamento assincrono. Eu recomendo.

Se estiver num Tomcat ou Jetty da vida, eu acho que não vale a pena instalar um serviço de fila só para um processamento assincrono, de repente vale a pena criar uma Thread mesmo.

Leonardo, boa tarde!

Como já foi dito, se estiver usando um servidor de aplicações completo, pode se usar JMS para chamadas assincronas ou (usei recentemente) uma chamada para um Web Services assíncrono (Oneway). No caso do Web Services assíncrono, sei que o servidor BEA WebLogic consegue trabalhar, não sei outros, acredito que sim.

E como é Web Services, talvez até o Apache Tomcat consiga implementar chamadas assíncronas. Por favor, faça um teste, no meu caso esta funcionando e como no sistema existem várias chamadas para Web Services, apenas criei mais uma.

Obs: Não usei JMS nesse sistema porque não tinhamos muito tempo para configurar o servidor, além de regras da empresa cliente.

Abraços.

De onde vc tirou isso? Que eu saiba essa é uma restrição imposta por servidores de aplicação mas aplicações web?

Claro que voce não deve criar uma thread por requisição porque estaria colocando sua aplicação web numa situação de vunerabilidade a usuários que poderiam consumir todos os recursos do servidor fazendo um flood de conexoes, mas criar uma thread numa aplicação web ser considerado anti-pattern, nunca ouvi falar disso.

[quote=eduardoac]Leonardo, boa tarde!

Como já foi dito, se estiver usando um servidor de aplicações completo, pode se usar JMS para chamadas assincronas ou (usei recentemente) uma chamada para um Web Services assíncrono (Oneway). No caso do Web Services assíncrono, sei que o servidor BEA WebLogic consegue trabalhar, não sei outros, acredito que sim.

E como é Web Services, talvez até o Apache Tomcat consiga implementar chamadas assíncronas. Por favor, faça um teste, no meu caso esta funcionando e como no sistema existem várias chamadas para Web Services, apenas criei mais uma.

Obs: Não usei JMS nesse sistema porque não tinhamos muito tempo para configurar o servidor, além de regras da empresa cliente.

Abraços.[/quote]

Porque vc acha que se trata de um webservice?

[quote=mochuara][quote=eduardoac]Leonardo, boa tarde!

Como já foi dito, se estiver usando um servidor de aplicações completo, pode se usar JMS para chamadas assincronas ou (usei recentemente) uma chamada para um Web Services assíncrono (Oneway). No caso do Web Services assíncrono, sei que o servidor BEA WebLogic consegue trabalhar, não sei outros, acredito que sim.

E como é Web Services, talvez até o Apache Tomcat consiga implementar chamadas assíncronas. Por favor, faça um teste, no meu caso esta funcionando e como no sistema existem várias chamadas para Web Services, apenas criei mais uma.

Obs: Não usei JMS nesse sistema porque não tinhamos muito tempo para configurar o servidor, além de regras da empresa cliente.

Abraços.[/quote]

Porque vc acha que se trata de um webservice?[/quote]

Oi, você me intepretou mal.
Não disse que a aplicação de nosso colega é Web Services, e sim, se ele escolhesse Web Services Assíncrono poderia rodar até com o Tomcat mesmo (“E como é Web Services, talvez até o Apache Tomcat consiga…”).

Abraços!

Bom,
acho que vc pode utilizar threads sem problemas.

Mas se vc optar por JMS e não usa um app server, sugiro o HornetQ, bem simples e facil de usar.
http://www.jboss.org/hornetq

[]´s

Fala Galera, desculpa a demora.
Obrigado a todos, eu acho q vo ter q usar Threads mesmo, o servidor é o velho e bom tomcat, por isso n rola de usar EJB’s. Eu vo dar uma estudada nisso, qualquer dúvida eu posto aí!

Fala galera, to batendo cabeça ainda…
Vou postar um pedaço do código pra vcs terem uma ideia… Doque eu não estou conseguindo executar.

 public void executa() {
 MinhaThread t  = new MinhaThread(); //Por exemplo: o método run conta 
 t.start(); 
}

Oq eu preciso é que o método run seja executado depois que o Vraptor direcione para executa.jsp… Não estou conseguindo fazer isso nem com macumba…

[]s!
Leonardo Gloria

Como está o trecho que faz o redirecionamento?

Para executar algo em background, como envio de emails em massa, uso a java.util.TimerTask.

Esse redirecionamento não é possivel, pois a thread que atendeu a requisição do browser já se foi, além de na thread vc não ter mais o response .

Ae rapazeada, mt obrigado!

Usei Timer taks e tah rodando redondo com o comportamento que eu queria!

Obrigado a todos e obrigado ao furutani!

[]s!
Leonardo Gloria

Fala, Leonardo…

Qual é o comportamento que vc estava esperando?

É possível postar o código fonte para análise?

Abraço.