Closed rodrigodiretriz closed 1 year ago
Muito obrigado pela analise e contribuição.. já fiz o Merge nos fontes...
Apenas adicionei um bloco de try/finally e mudei a destruição do objeto para Bmp.Free
Eu também estava com problema na geração dos relatórios em paralelo em thread, e atualizei meus fontes e passou a funcionar perfeitamente agora, obrigado pela sua dedicação
Erro durante geração concomitante de relatórios (via requisições webservice e/ou multi-thread)
Excessão ocorre durante chamadas de relatórios concomitantes. É possível reproduzir esse comportamento a partir do exemplo "trunk\Demos\Datasnap\Server" (simular com 3 requisições são sufientes para obter o erro). Erro obtido: Project server_console.exe raised exception class Exception with message 'Relatorio: Erro durante a preparação do relatório EAccessViolation(Access violation at address 77C1F633 in module 'ntdll.dll'. Write of address 00000014)'.
A solução adotada para o caso foi modificar a "function NeedAuxBitmap: TBitmap" (unit RLUtils) para não mais retornar a variável auxiliar "AuxBitmap: TBitmap" (encapsulada na unit), além tratar a destruição do objeto retornado por ela no locais onde a função "NeedAuxBitmap" é utilizada. O tratamento foi destruir a instância em cada local onde a mesma é utilizada, exceto aquele que usa o TBitmap do NeedAuxBitmap como Result (caso da function HexToBitmap(), unit RLUtils).
Anexo estão as units corrigidas, para análise (aprovação e posterior commit no projeto FortesReport-CE).
Source.zip
Após essas alterações foi possível atender até 40 requisições de geração simultânea de relatórios usando o FortesReport (nosso projeto é um webservice com mecanismo de servidor de relatórios encorporado).
Apesar da geração do relatório ter sido resolvida com as instruções anteriores, há ainda uma situação intermitente em que acima de 40 requisições (gerações simultâneas), após o relatório ser gerado, no final do processamento do método "TRLPDFFilter.FilterPages()" (usado para geração de pdf) obtem-se o erro:
Obs1: as ferramentas utilizadas para teste/simulação foram Postman (com duplicação de abas e breakpoint no projeto antes da geração ser iniciada) e Apache JMeter.
Obs2: o modelo de geração adotado no projeto é similar àquele do exemplo "trunk\Demos\Datasnap\Server", implementado na procedure TWebModule1.SendReport(Report:TRLReport; Response:TWebResponse).
Source.zip