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
Qual o problema em usar uma Thread convencional? Voce quer saber como criar uma thread em Java? É isso?
M
mochuara
Esta sugerindo que ele use um AppServer com suporte a EJB só pra processar algo em background? :shock:
Rubem_Azenha
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.
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.
M
mochuara
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.
M
mochuara
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.
Porque vc acha que se trata de um webservice?
eduardoac
mochuara:
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.
Porque vc acha que se trata de um webservice?
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!
jgbt
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
Leonardo_Gloria
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í!
Leonardo_Gloria
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.
publicvoidexecuta(){MinhaThreadt=newMinhaThread();//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
M
marcobiscaro2112
Como está o trecho que faz o redirecionamento?
furutani
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 .
Leonardo_Gloria
Ae rapazeada, mt obrigado!
Usei Timer taks e tah rodando redondo com o comportamento que eu queria!