Dando uma pesquisada no fórum vi que não é aconselhável usar threads dentro de aplicações web.
Na minha aplicação eu uso threads e ela roda no tomcat6, sendo que um determinado momento quando a aplicação começa a trabalhar realmente, o tomcat sai do ar.
Isso pode está acontecendo por causa das threads?
E outra coisa eu preciso fazer várias requisições sockets ao mesmo tempo, por isso o uso de threads, como poderia fazer isso sem threads? Tirar a parte da aplicação que usa threads e deixar rodando como um serviço do linux?
Tomcat e threads
12 Respostas
Sugiro a utilização do Spring Framework, ele possui classes para definição de Tarefas Temporizadas, Agendamento de tarefas, e muitos outros recursos que tornam o Tomcat um bom ambiente para rodar uma aplicação que vai além dos request/response de aplicações web!
Sabe se no Spring eu consigo fazer tipo um serviço… por exemplo quando um arquivo for “populado” e um tabela também disparar uma thread?
Dê uma olhada na nesta documentação:
No projeto em que estou trabalhando, existe um serviço que é disparado por um Scheduler do Spring para sincronização de alterações de dados de cadastro entre servidores.
As alterações são informadas em uma tabela e o serviço temporizado (que é executado em uma thread) faz um pooling para verificar se existe dados para envio.
Criar um scheduler para enfileirar as tarefas de atualizações de arquivo e tabela pode ser melhor do que criar diversas threads manualmente. Threads consomem bastante recursos do sistema operacional e devem ser bem planejadas.
O pool de threads do Spring permite que a execução destas tarefas em thread sejam melhor dimensionadas.
Sabe se eu consigo ter um desempenho bom com este framework, porque eu tenho que ficar “olhando” a tablea a cada 1ms, ou seja, assim que chegar algum dado ele tem que ser enviado via socket.
1 ms é tempo-real praticamente…
quantos registros você teria por segundo…
Isso depende do dia e sendo que o retorno de dados é configuárvel, por exemplo se chegarem 1000 registros naquele momento eu só posso trazer 200 e enviá-los.
Acredito que o Scheduler vai atender o seu propósito, mas se o processamento dos dados demorar segundos, a próxima chamada só ocorrerá quando a chamada em execução for finalizada.
O problema é este, por isso eu estava usando um loop inifinito para isso, com duas threads. Porque não pode esperar acabar um para fazer outro.
Por exemplo, a aplicação foi no banco e pegou 200 linhas as 200 viram threads e são enviadas por sockets, se 80 forem processadas no mesmo instante, então, a aplicação vai no banco e pega mais 80.
Usa um esquema de fila do JMS, apesar de você criar 200 threads, não significa que estas estarão sendo processadas simultaneamente. No fim as mensagens serão enfileiradas mesmo.
Você pode colocar uma mensagem na fila e o JMS se encarrega de processar todas.
Mensagens assíncronas!
Poderia explicar como funciona o JMS? Ou tem algum artigo que possa indicar?
Para que eu possa ver se atende as exigências.
Tem o tutorial da SUN
http://java.sun.com/products/jms/tutorial/index.html
JMS - Java Messaging Service
Na documentação do Spring também tem alguma coisa sobre o assunto.
Uma implementação de JMS e Enterprise Integration Patterns (http://www.enterpriseintegrationpatterns.com/) é o ActiveMQ da Apache (http://activemq.apache.org/)
Sugiro uma consulta no ActiveMQ. Ele integra fácil com Spring.
Muito obrigado vou ler sobre o assunto e sobre o ApacheMQ.
Aproveitando… estava pensando em usar o pool de conexões do tomcat, você sabe se o pool de conexões chegar no máximo de conexões o que acontece? A aplicação fica esperando até conseguir uma conexão?
Você conhece alguma ferramenta web de profiling boa, sem ser o probe? Ou você tem algum artigo ou documentação de como interprestar as informações que o probe tem?