TimeOut

Usuários Java pesso a ajuda de vcs,

Vamos ao problema: Tenho uma aplicação em Java q solicita um serviço via CORBA com o objetivo de montar uma tabela temporária q conterá os dados para montagem de um relatório em HTML q o servlet se encarrega de resolver. Esta aplicação estava rodando as mil maravilhas até q o tamanho da base de dados de meu cliente cresceu de tal forma e complexidade q para montar esta tabela o relatório leva mais de 1 hora para gerar. O q esta havendo é q depois de 1 hora exatamente da erro de TimeOut … janela q era para trazer o relatório formatado, esta vindo em branco.

Já fiz teste na parte C++ q o CORBA acessa para verificar se é erro dele, fiz testes no client do C++ pelo corba e em todos os casos ele gera os dados com o tempo em média de 1:30. Porém quando mando o relatório ser processado via Java esse erro acontece.

Vcs teem alguma ideia do q possa estar acontecendo, tem alguma configuração a ser feita. Mas detalhes, uso Tomcat, porém mesmo erro ocorre com JRun. Estou desconfiado q seja Timeout do browser, existe isso? … :shock:

Enfim, espero ter me espressado bem e aguardo alguma ajuda.
Valeu e []'s a todos

:drinking: * acho q estou precisando ficar de porre!! :slight_smile:

No teu web.xml, coloque a diretiva “servlet-timeout” especificando em milisegundos o tempo maximo de inatividade permitido ( provavelmente eh por isso que esta dando problema com voce ).

<servlet-timeout>7200000</servlet-timeout>

Rafael

Valeu Rafael,

Mais descobrimos aqui o problema, como suspeitava o problema era do browser. Utilizando o oráculo (www.google.com), ele nos deu a resposta.

:2gunfire:Link: http://www.freshwater.com/support/notes/noteTN10394.htm

O problema não era de TimeOut do servlet, pq fiz um bacalhau onde o applet solicitava um serviço para o servlet, q por sua vez so processava um loop infinito. Bom não poderia cair a sessão pq em tempos em tempos eu enviava um request para uma espécie de tela de progresso q criei. Estava desconfiado ou do tread principal q ficou esperando a confirmação q o processamento do servlet acabou ou browser. No bacalhau notamos q em 1 hora o brower cansava de esperar e abria uma tela em branco … porem o servlet continuava processando o loop, como sei disso? ficava cuspindo um log com o horario local do tipo: “passei aqui tal hora!!”. e o log continuou sendo processado. Talvez isso explique pq o JAVA não gerava nenhuma exception.

Basicamente cfg o Receive Timeout dos atributos de internet para windows. Resta saber se isso tb ocorre em outros SO da vida. Outros testes q não fiz mas seria legal fazer é ver se no Netscape (ou qualquer outro browser) esse problema tb ocorre e se com mesma cfgção resolvera o problema.

8) Valeuuu galera … fuiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii

:twisted: * probleminha sinistroooo putz!!! :smiley:

Raul, vc queria que o Java lançasse uma exceção quando roda um loop infinito??

Esse loop deveria terminar quando seu papel acabou (no bom sentido). Uma idéia pode ser fazer um processo assim:

  1. Dois servlets: um faz o request CORBA e outro mostra o resultado
  2. No meio, uma página de espera, com HTML que redireciona ao segundo servlet passando um identificador de resultado.
  3. O segundo servlet mostra uma tela do tipo “aguarde” caso o relatório não esteja pronto.

*) Vc pode fazer algum tipo de construção em CORBA para apenas pegar o relatório pronto (como um objeto ou em byte[ ]) , pra ser chamada pelo segundo servlet.

A parte boa é que você controla (mais ou menos, pq nem todo browser suporta redirection) o tempo de espera do usuário sem ter que mexer nas configurações do SO dos seus clientes.

A parte ruim é que vc precisa “distribuir” o processo em dois servlets (e algumas threads ou RPCs de CORBA), e isso dá um trabalhão. Além disso, vc tem que fornecer uma alternativa para o usuário cujo browser não faz redirect que pode inutilizar todos os seus esforços: dar um link para ele.

[]s!!

O timeout INFINITO pode ser setado no web.xml assim:

<servlet-timeout>0</servlet-timeout>

[]´s

Duke Jeffrie,

Opa valeu … mas vou exclarecer um pouco mais o meu problema, e dar uma opnião. A guj poderia fazer uma matéria sobre tempo limite de espera de uma treads, sessões, browsers, servlets, servidores, etc e tal … pq seria muito util para pessoas q necessitem rodar um processo pesado onde o tempo limite possa afetar. É claro q é uma matéria q sairia um pouco do escopo JAVA, mas é um assunto q pouco se fala eu acho … pelo menos nos sites nacionais.

Bom voltemos ao assunto em questão. Vou detalhar um pouco + o funcionamento deste aborto (relatório em questão), que peguei para dar suporte:

[i]"Ele é costituido de 2 applets … 1 c/ a janela q coleta os parâmetros para emissão e outro é um form q funciona como 1 barra de progresso do relatório. O processo possui um único servlet q solicita o tal processamento para o CORBA q é a interface com uma dll escrita em C++. A barra de progresso fica recebendo objetos sucessivos do CORBA com informações do tipo processo de validação ok … processo de coleta de dados ok … e vai por ai a fora … dando sempre um parametro do ponto em q esta relatório.

Quem solicita esse processo começa pelo form de progresso. Q possui 2 treads um do serviço e outro do progresso. Desconfiei do tread de serviço, mas como falei o servlet continuou rodando."[/i].

Explicando meu teste direito:

“O loop infinito foi so 1 maneira de testar se o problema estava no JAVA ou não … acreditei q caso uma sessão, servlet, expirasse … desse TimeOut. O Java iria reportar alguma messagem qualquer, ou de log ou de exception, enfim … alguma fumaça iria dar. Porém como eu disse e volto a falar o servlet continuou processando o loop q estava fazendo um log … o browser q estava esperando o retorno q expirou … deu TimeOut”.

Mas olha, da maneira q vc falou … mesmo assim eu teria um pagina q ficaria esperando um request de final do processamento … ou seja eu teria um browser q ficaria esperando o retorno do processamento do servlet, não teria? … confeço não ter compreendido direito a sua sugestão.

Bom me explique direito sua sugestão pois o lerdinho aqui boio!! :?
Valeuuuu []'s

:roll: * é complicado mesmo … fazer o q ne … ainda bem!! :lol:

Opa! Vc disse applets?? Applets Java??

Pra que vc precisa de servlets então??

Minha idéia consistia em fazer uma espécie de waitable variable, assim:

  1. Em vez de um objeto CORBA com um único método assim:
public Relatorio geraRelatorio&#40;&lt;parametros&gt;&#41;;

Você teria algo assim:

public string criaRelatorio &#40;&lt;parametros&gt;&#41;;
public Relatorio pegaRelatorio&#40;in string identificador&#41;;

O relatório, uma vez completo, iria parar numa tabela que mapeia identificador -> relatorio.

  1. Seus servlets funcionariam assim:
  • O servlet que recebe os dados do formulário iria passá-los como parâmetro para o criaRelatorio, e mostrar uma página que, depois de alguns segundos (possivelmente zero), faz o browser enviar um request para o segundo servlet. Chamaremos essa página de intermediária.
  • O segundo servlet tenta pegar o relatório pedido (no request, ou pela session), com o método pegaRelatorio. Se o relatorio ainda não estivesse pronto, ele mostraria a página intermediária novamente.

Como disse, há vantagens e desvantagens. Principalmente porque é mais difícil gerenciar erros assim. Não sei quanto controle vc tem sobre o CORBA pra fazer isso.

Se você usa mesmo applets, vc pode ter uma abordagem completamente diferente. Vc pode fazer o applet pedir os dados para o objeto CORBA, e assim utilizar o mesmo código CORBA que vc já tem. Só que como o servlet já terminou o processamento da página, não vai ter timeout.

Mas aí tem um problema, que é de segurança: seu applet pode falar direto com o CORBA? Isso requer que ele esteja acessível para os clientes, e não sei se é o caso.

Uma pergunta que eu não fiz na outra mensagem: o que é um bacalhau?? :slight_smile:

[]s

Duke Jeffrie,

I Understand now!! … :lol: … Mas vamos direto ao assunto … onde trabalho temos problemas de seguir um certo padrão, isso pra q? … qualquer um q pegue este ou qualquer outro relatório temos um modelo especifico, um q utiliza CORBA outro q não utiliza, modelo para cadastro ou seja processos básicos possuem modelos para serem feitos, isso faz com q fiquemos um pouco amarrados, porém traz agilidade na manutenção do código, pois todo código é muito parecido. Daí vem a explicação da existencia do servlet. Concordo q daria para comunicar com o CORBA diretamente do Applet.

Achei interessante sua idéia, mas por hora … vamos ajustar somente o sistema em questão. Ou seja, configuraremos o sistemas … até pq o problema é do sistema e não da aplicação q desenvolvemos.

:stuck_out_tongue: E Bacalhau? … bom bacalhau é um de programa de teste q fazemos para testar algo especifico q vc queira testar. Vou dar um exemplo: Caso vc queira verificar se em um cadastro automático “X”, seu processo esta fazendo o devido mecanismo quando chega na inserção de um item número 99544, o q vc faria? … vc iria no “for” e marretaria o código para q vc não precise ficar esperando uma eternidade, caso deixasse por conta do código processar.

Enfim, isso é um bacalhau … vc marretar um código para q haja um desvio rápido de processamento e ver um dado resultado mais rápidamente. Bom só não vai esquecer depois de tirar o bacalhau … rs … isso é uma espécie de bacalhau (Noruegues, Paraguaio … rs … to zoando). Foi o meu caso ao invés do servlet solicitar ao corba um serviço, o q fiz? … botei um loop infinito … para q verificasse onde estava dando TimeOut … foi quando constatei q o TimeOut era do Browser e não do servlet.

Bom valeu + 1 vez!! achei interessante a ideia de burlar o controle do sistema. Se precisar tamos ai pra tentar ajudar. Sou um iniciante ainda no JAVA … mas estou achando muito bom desenvolver nele.

Fuiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii :twisted: