O Adobe ColdFusion a partir da versão 7, passou a ter a capacidade de gerar documentos PDF e FlashPaper de maneira "on the fly", tornando uma tarefa que antigamente era trabalhosa e chata (alguém lembra da custom CF_PDF? argh?!..) em algo simples na hora de gerar tais documentos.

A tal facilidade passou a ser um problema dia desses, quando implementei em um dos meus clientes a função de geração em formato PDF de documentos, para padronizar a impressão; pois bem, ocorre que por motivos de log dos arquivos que eram gerados, ficou definido que os mesmos, seriam salvos fisicamente no servidor, para que posteriormente fossem anexados e enviados por email; a intenção de salvar localmente os arquivos era tão somente por conta do envio desse log por e-mail; tanto, que na configuração da geração do arquivo .pdf, defini um valor padrão para o nome do arquivo, que seria substituído em request futuros, caso o arquivo já existisse.
O mecanismo até que funcionou perfeitamente por alguns dias, até que outros usuários, começaram à fazer uso da função, causando repentinamente em horários de pico de uso do sistema, uma lentidão considerável do application server e um erro estranho na tentativa de geração do documento:

ExceptionConverter: java.io.IOException: The document has no pages. at com.lowagie.text.pdf.PdfPages.writePageTree(Unknown Source) at com.lowagie.text.pdf.PdfWriter.close(Unknown Source) at com.lowagie.text.pdf.PdfDocument.close(Unknown Source) at com.lowagie.text.Document.close(Unknown Source) at coldfusion.tagext.lang.DocumentTag.doAfterBody(DocumentTag.java:1225)(...)

Depois de tanto alterar código, pensado que fosse algo ligado à performance da geração, ou até algum possível bug, com uma suposição com relação à escrita de arquivos em disco rígido, a primeira linha (ExceptionConverter: java.io.IOException: The document has no pages.) foi matadora para diagnoticar o que estava acontecendo: a condição de gravar o arquivo de log, sempre gerava o mesmo nome para o dito cujo: algo parecido com xyz.pdf. E era exatamente essa a condição errônea: deixar que dois usuários pudessem gerar um arquivo pdf com o mesmo nome em um mesmo diretório: erros de io geralmente são derivados de situações de escrita ou leitura, e permitindo que usuários tivessem acesso à essa geração sem qualquer tipo de controle, fazia com que o erro fosse lançado (o mecanismo de geração do PDF, simplesmente não conseguia criar dois documentos de forma simultânea), e deixasse o app server lento (enquanto o request, não era abortado, o CF aguardava a liberação de escrita).

A dica para resolver o problema ficou por conta de alterar a condição de nomeação dos arquivos para impedir esses tipos de acessos inválidos;

Entretanto, a mensagem "The document has no pages." possui uma outra causa, por conta de problemas na resolução de DNS quando se referencia arquivos externos no documento tais como imagens, etc. Encontrei durante minha pesquisa para solução do problema, um post que comenta em detalhes o motivo e a solução para este outro problema.

 


Comments




Leave a Reply

Name (required)
Email (not published)
Website


 

    Sobre o autor

    Rafael Silva, atua na área web há mais de cinco anos, prestando serviços de consultoria e treinamento em diversas empresas, sendo especialista na plataforma ColdFusion/JRun. Também possui experiência no desenvolvimento web com PHP, extJS e Flex.

    View Rafael Silva's profile on LinkedIn

    Arquivos

    October 2008
    September 2008
    August 2008
    July 2008