[OC4J] Internal Server Error ao processar requisição demorada

6 respostas
B

Pessoal,

Possuo uma aplicação para geração de relatórios que está hospedada num servidor OC4J, da Oracle. Tudo funciona perfeitamente, à exceção de um relatório que demora em torno de 15 minutos para gerar (devido a sua complexidade e à quantidade de dados retornada pela consulta).

O problema com este relatório é que, após determinado tempo de processamento da requisição (em torno de 10 minutos), a página apresenta o erro “500 Internal Server Error”. No entanto, o processo continua ativo e termina normalmente “por baixo dos panos”. Eu posso afirmar isso pois a geração do relatório é feita através de um Servlet que grava um arquivo PDF no servidor. Ou seja, mesmo que ocorra o erro na página, o relatório acaba ficando salvo no servidor. Infelizmente, isso não me basta, pois não posso ter este erro.

Alguma ideia do que fazer? Já tentei configurar o ping como informa no seguinte link da documentação oficial (e também não funcionou): http://download.oracle.com/docs/cd/B14504_01/dl/release_notes/chap_oc4j.htm#BDCBEDDA

Qualquer ideia já será muito bem vinda. Obrigado.
Obs.: além do erro, não é gerado absolutamente em nenhum arquivo de log.

6 Respostas

G

Não dá para fazer esse relatório asincrono? Usando OC4J você pode configurar facilmente uma fila JMS e disparar uma mensagem para um EJB processar o relatório para você. Então você pode liberar a tela e fazer um refresh a cada X segundos para ver se o relatório está pronto. Assim que o relatório estiver pronto, você mostra um link para download.

Outra sugestão, se é um relatório muito grande, você não pode criar um job no oracle para rodar na madrugada e já deixar os dados pré-populados em uma tabela? Assim toda a madrugada ou de X em X tempos você atualiza a tabela.

Normalmente uso alguns desses artificios quando há consultas muito pesadas e que não valem a pena fazer online.

B

garcia-jj, em primeiro lugar, obrigado pela resposta.

Sobre executar um job no Oracle, isso não funcionaria para o meu caso pois o relatório está disponível para mais de 100 usuários. É claro que nem todos utilizam, na verdade devem ser apenas 2 ou 3, no entanto, eu não tenho como prever quem e nem quando será feita a geração. Além disso, o relatório é populado de acordo com o usuário que gera e outros fatores que ele mesmo pode modificar apenas para gerar o relatório, entende? É uma situação bem complexa, não tem como prever.

Sobre JMS, para ser bem sincero, nunca utilizei. Gostei da ideia e é possível que funcionasse, no entanto, vou esperar um pouco mais para tentá-la pois acho um tanto complexa para a minha situação. Acredito que seja possível resolver meu problema através de alguma configuração do OC4J, mas infelizmente ainda não descobri qual.

De qualquer forma, obrigado pelas ideias.

B

Ninguém mais galera?

luisweirich

Oi Bruno,

Estou com o mesmo problema que você teve.

Pode postar como resolveu?

B

Boa tarde, Luís.

Consegui resolver o problema ao alterar o parâmetro de timeout (não lembro o nome exato dele) no arquivo $ORACLE_HOME/Apache/Apache/conf/http.conf.

O valor padrão era 300, meu problema ficou resolvido quando alterei para 1200. Lembrando que após esta alteração é necessário reiniciar o servidor.

Boa sorte! Abraço

luisweirich

Muito obrigado.

Foi de grande ajuda.

Criado 14 de julho de 2010
Ultima resposta 12 de jan. de 2011
Respostas 6
Participantes 3