Loading ...
Sorry, an error occurred while loading the content.

ENC: RES: [riojug] Re: Error Out of Memory no Tomcat

Expand Messages
  • Diogo Capistrano
    Muito obrigado pelas respostas até agora, estão ajudando muito. Estou pensando mesmo em separar sim, até porque não sei se o tomcat iria gerenciar legal
    Message 1 of 1 , Jan 30, 2009
    • 0 Attachment

      Muito obrigado pelas respostas até agora, estão ajudando muito.

      Estou pensando mesmo em separar sim, até porque não sei se o tomcat iria gerenciar legal estas threads criadas.

      Mas vou especificar melhor a aplicação.

      O sistema tem 3 partes:

      - A primeira parte é que pega os dados, é uma servlet simples que recebe várias requisições e guarda as mesmas em um txt;

       

      - A segunda parte pega os dados que estão dentro do txt e manda para o banco de dados. Esta parte é uma thread que pode ser inicializada pelo usuário e esta thread fica em loop inifinito.

       

      - A terceira parte pega os dados do banco e envia por socket. Esta parte também é uma thread e também fica em loop infinito, e ela gera várias sub-threads, a quantidade de sub-threads geradas é configurada pelo usuário antes de inicializar o processo, claro que este sistema não será usado por qualquer usuário, porque o mesmo sabe os problemas que podem ser gerados se esta quantidade de sub-threads for muito alto.

       

      O que eu estava querendo fazer é tirar a segunda e a terceira parte de dentro do tomcat e colocar para rodar como daemon. Sendo que eu gostaria de saber se tem como eu inicializar e parar o processo através de uma interface web?

       

      Debugando a aplicação eu vi que ela está rodando legal do modo como ela está, mas até agora não precisou de muito processamento, o meu medo é quando aumentar o processamento, porque o tomcat vai começar a receber requisições, que são threads, e vai gerar mais threads quando as aplicações forem inicializadas. O único problema que encontrei até agora foi que quando aumentou um pouco o processamento, a aplicação não conseguia conectar no banco de dados e ai é gerada uma exception que no tratamento dela tinha um Sysm.exit(0), que acaba matando até o tomcat.

       

      De: riojug@yahoogroups.com [mailto:riojug@yahoogroups.com] Em nome de Romano Silva
      Enviada em: quinta-feira, 29 de janeiro de 2009 11:23
      Para: riojug@yahoogroups.com
      Assunto: Re: RES: [riojug] Re: Error Out of Memory no Tomcat

       

      Diogo,

      se você tém acesso ao sistema operacional e pode criar uma aplicação em linha de comando, eu acredito que seja uma solução mais prática por alguns motivos:

      1) Se você precisar para o processo que está rodando em batch, não precisa parar toda a aplicação.
      2) Você poderá fazer um sistema que aceite comandos para recuperar o status da execução da sua thread, funcionando assim como um daemon (no container, a única maneira de fazer isso seria criando uma aplicação Web para retornar os status das threads ou dos MDBs)
      3) Usando MDB padrão, você estará restrito a interface do padrão J2EE que não lhe dá muita informação sobre os processos (Message Beans) em execução nem o status das filas. Se você quiser algo específico do container pode ser que consiga algo mais interessante. Para acessar a fila, você vai precisar da senha do container e do usuário, que pode não estar disponível em um ambiente de produção controlado.
      4) Usando Timers do EJB: não gosto do padrão EJB para timers. Tive sérios problemas em uma aplicação que usava timers. A implementação depende do container e o maior problema que tive foi quanto ao start/stop da aplicação. Aparentemente os timers eram parados, mas quando voltava a aplicação, os timers eram iniciados várias vezes (não sei porque). Ainda, encontrar o timer ativo para pará-lo exige que você faça uma interface web ou um método EJB para isso.

      Quanto a sua aplicação de linha de comando, você pode utilizar Spring + Quartz que lhe dará uma sintaxe cron-like, permitindo que você agende a execução das threads iguais ao processo cron do sistema operacional (mesmo no Windows). Utilizando ainda Spring + JdbcTemplate ou JPATemplate, acessar os dados via JDBC/JPA fica muito simples.

      Minha experiência prática: fizemos um sistema que tinha Queues e Timers. Os timers jogavam para as queues que processavam os dados. Os problemas que tivemos foram apresentados acima: os timers eram inconsistentes. Para saber o que tinha em cada fila, tivemos que usar uma solução dependente da plataforma. Para parar os timers, a única maneira encontrada foi parar todos de uma determinada classe (não foi problema para esse projeto, mas não é elegante). Como foi tudo feito usando um único EAR (principalmente pq usamos JAAS e autenticar por fora da aplicação Web é humanamente impossível - acho que eu nunca mais uso JAAS na minha vida), não era possível redeployar os timers sem parar a aplicação. E o mais crítico, parar os timers exige acesso a aplicação - o que não é viável dentro do contexto do cliente - ele quer parar o timer através do manager do container ou linha de comando, pois ele não quer dar acesso a aplicação só para isso. No final, estamos trocando tudo para uma aplicação batch. Muito tecnologia pode, as vezes, atrapalhar.

      Quer deixar claro, que muito dos problemas podem ter sido causados por algum erro da equipe, não entro no mérito disso, só estou dando minha opinião sobre o assunto. Não quer discutir aqui o que é melhor, pois isso depende de cada contexto, de cada projeto, etc...

      Um abraço e boa sorte,
      Romano


      Diogo Capistrano wrote:

      Pensei em separar a aplicação porque estava pesquisando e vi que não é “legal” colocar threads dentro de aplicações jee.

      Sendo que eu não saberia como fazer várias requisições ao mesmo tempo sem ser com threads. Lembrando que estou usando o tomcat6.

       

      De: riojug@yahoogroups.com [mailto:riojug@yahoogroups.com] Em nome de Andre Krepsky
      Enviada em: quarta-feira, 28 de janeiro de 2009 11:16
      Para: riojug@yahoogroups.com
      Assunto: [riojug] Re: Error Out of Memory no Tomcat

       

      Este parametro foi suprimido no Tomcat 6.0.
      - maxSpareThreads: The maximum number of unused request processing
      threads that will be allowed to exist until the thread pool starts
      stopping the unnecessary threads. The default value is 50.

      Como o Tomcat elege as threads "desnecessarias" eh um misterio para mim...

      Jah quanto a dividir a aplicacao, em minha visao, colocar "uma parte"
      do codigo para rodar fora do container web faz sentido somente se essa
      "parte" se tornar um fornecedor de servicos; completo e desvinculado
      da aplicacao original.

      Dividir uma aplicacao e colocar cada parte para rodar num "container"
      diferente me faz lembrar do mal-fadado "Moke Twin", um prototipo 4x4
      que usava dois motores, um para tracao dianteira e outro para a
      traseira (http://www.4wdonline.com/ClassicCars/Moke2.html).

      Obviamente, nao funcionou.

      [ ]s
      Andre Krepsky

      --- In riojug@yahoogroups.com, "Diogo Capistrano"
      <diogocapistrano@...> wrote:
      >
      > Tenho uma aplicação que roda dentro do tomcat, esta aplicação gera 2
      threads
      > que ficam rodando em loop infinito, a segunda thread gera outras
      threads,
      > que são setadas antes de iniciar o programa.
      >
      > Essas sub-threads, geradas a partir da segunda thread, ficam fazendo
      várias
      > requisições via sockets e atualizações no banco, quando elas fazem a
      > atualização ela abre e fecha uma conexão com o banco.
      >
      >
      >
      > Quando as requisições sockets começam a ficar presas do outro lado,
      em um
      > determinado momento eu recebo este erro e tomcat para:
      >
      > · ERROR: out of memory
      >
      > · Detail: Failed on request of size 8.
      >
      >
      >
      > Sendo que o timeout do socket está setado para 30s.
      >
      > Aproveitando gostaria de tirar uma dúvida o que é "Max spare threads"?
      >
      > Será que eu devo tirar esta parte da aplicação dentro do tomcat, e
      colocar
      > para rodar via linha de comando?
      >
      >
      >
      >
      >
      >
      >
      >
      > No virus found in this outgoing message.
      > Checked by AVG.
      > Version: 7.5.552 / Virus Database: 270.10.14/1918 - Release Date:
      27/01/2009
      > 07:26
      >

       

      No virus found in this incoming message.
      Checked by AVG.
      Version: 7.5.552 / Virus Database: 270.10.15/1921 - Release Date: 28/01/2009 06:37

       

      No virus found in this outgoing message.
      Checked by AVG.
      Version: 7.5.552 / Virus Database: 270.10.15/1921 - Release Date: 28/01/2009 06:37

       

       

      No virus found in this incoming message.
      Checked by AVG.
      Version: 7.5.552 / Virus Database: 270.10.15/1921 - Release Date: 28/01/2009 06:37

       

      No virus found in this outgoing message.
      Checked by AVG.
      Version: 7.5.552 / Virus Database: 270.10.15/1921 - Release Date: 28/01/2009 06:37


      No virus found in this outgoing message.
      Checked by AVG.
      Version: 7.5.552 / Virus Database: 270.10.15/1924 - Release Date: 29/01/2009 17:57

    Your message has been successfully submitted and would be delivered to recipients shortly.