Ir para conteúdo
  • Cadastre-se

dev botao

ACBrLib - Erro demo ACBr.API GerarPDF - Multithreading


rael
  • Este tópico foi criado há 135 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Bom dia,
   
   Estou tendo o seguinte problema ao utilizar o projero "Projetos\ACBrLib\Demos\C#\ACBr.API".
   Baixei o projeto do svn , segui os passos do vídeo    https://www.youtube.com/watch?v=SuZ46PWW31U "Nova demonstração da ACBrLib utilizando API em C#".
   Baixei a "ACBrLibNFeDemo-0.4.6.199".
   
   Aqui vou focar na opção NFeController/GerarPdf que realmente é a que preciso.
   
   Quando chamado o método apenas uma vez ele funciona perfeito.
   Mas quando chamado várias vezes ao mesmo tempo, que seria para isso a função multithreading começamos a ter alguns erros:
   
   Access violation
   em ACBrLib.Core.ACBrLibHandle.CheckResult(Int32 ret) em C:\Projetos\ACBRDiretoSVNdeles\Projetos\ACBrLib\Demos\C#\Shared\ACBrLib.Core\ACBrLibHandle.cs:linha 277
   em ACBrLib.NFe.ACBrNFe.FinalizeLib() em C:\Projetos\ACBRDiretoSVNdeles\Projetos\ACBrLib\Demos\C#\NFe\Imports\Dinamico\MT\ACBrNFe.cs:linha 616
   em ACBrLib.Core.ACBrLibHandle.ReleaseHandle() em C:\Projetos\ACBRDiretoSVNdeles\Projetos\ACBrLib\Demos\C#\Shared\ACBrLib.Core\ACBrLibHandle.cs:linha 127
   em System.Runtime.InteropServices.SafeHandle.InternalRelease(Boolean disposeOrFinalizeOperation)
   em System.Runtime.InteropServices.SafeHandle.Dispose()
   em Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.DisposeAsync()
   
   Outras vezes :
   rlVenda (Division by Zero)   
   
   No vídeo não vi o teste do postman sendo feito com várias requisições ao mesmo tempo.Acredito que tenham feito com certeza.
   
   Alguém com alguma dica do que pode ser.
   
   OBS: Temos a versão compilada no Lazarus.Mas como estava com o mesmo problema, resolvi ver se com Demo seria diferente.

Link para o comentário
Compartilhar em outros sites

  • Administradores

Boa tarde,
Queira por favor anexar o log da lib..

Sugiro também verificar este tópico de nossa Base de Conhecimento

At.

Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link para o comentário
Compartilhar em outros sites

Bom dia,

Obrigado pela atenção.

1º) Referente ao tópico que você me sugeriu, é por esse tópico e pelo vídeo   https://www.youtube.com/watch?v=SuZ46PWW31U "Nova demonstração da ACBrLib utilizando API em C#" que já estou me orientando:

 

2º) Referente ao log, estou conseguindo gerar apenas o logSimples os outros tipos de logs não estão gerando.

Estou utilizando o código de vocês do exemplo "ACBrLib\Demos\C#\ACBr.API\ACBr.API"  com "Memory" e não .ini. Como no exemplo de vocês não tinha o caminho do log adicionei no código.
Coloquei o logSimples em anexo, mas acredito que não vai ajudar muito para descobrir o problema de "Access violation" .Se tiver uma dica de como gerar os outros logs nesse exemplo de vcs de API C# com multithread, agradeço muito.
Como está atualmente meu código no Exemplo de vocês da API C#:


public async Task<IActionResult> GerarPdf([FromServices] ACBrNFe nfe, IFormFile xmlNFe)
        {
            if (!xmlNFe.FileName.EndsWith(".xml")) return BadRequest();

            using var stream = new StreamReader(xmlNFe.OpenReadStream());
            nfe.CarregarXML(await stream.ReadToEndAsync());

            var codigo = Guid.NewGuid();
            var path = Path.GetTempPath();
            var nomeArquivo = $@"{codigo}.pdf";

            nfe.Config.Principal.TipoResposta = ACBrLib.Core.TipoResposta.fmtJSON;
            nfe.Config.Principal.CodificacaoResposta = ACBrLib.Core.CodResposta.UTF8;
            nfe.Config.Principal.LogNivel = ACBrLib.Core.NivelLog.logSimples;            
            nfe.Config.Principal.LogPath = "C:\\Dados\\AcbrApi\\";            

            nfe.Config.DANFe.MostraSetup = false;
            nfe.Config.DANFe.MostraPreview = false;
            nfe.Config.DANFe.MostraStatus = false;
            nfe.Config.DANFe.PathPDF = path;
            nfe.Config.DANFe.NomeDocumento = nomeArquivo;

            nfe.ImprimirPDF();

            var fs = new FileStream(Path.Combine(path, nomeArquivo), FileMode.Open);


          

ACBrLibNFE-20221209.log

Link para o comentário
Compartilhar em outros sites

  • Consultores
Em 09/12/2022 at 08:08, rael disse:

Bom dia,

Obrigado pela atenção.

1º) Referente ao tópico que você me sugeriu, é por esse tópico e pelo vídeo   https://www.youtube.com/watch?v=SuZ46PWW31U "Nova demonstração da ACBrLib utilizando API em C#" que já estou me orientando:

 

2º) Referente ao log, estou conseguindo gerar apenas o logSimples os outros tipos de logs não estão gerando.

Estou utilizando o código de vocês do exemplo "ACBrLib\Demos\C#\ACBr.API\ACBr.API"  com "Memory" e não .ini. Como no exemplo de vocês não tinha o caminho do log adicionei no código.
Coloquei o logSimples em anexo, mas acredito que não vai ajudar muito para descobrir o problema de "Access violation" .Se tiver uma dica de como gerar os outros logs nesse exemplo de vcs de API C# com multithread, agradeço muito.
Como está atualmente meu código no Exemplo de vocês da API C#:


public async Task<IActionResult> GerarPdf([FromServices] ACBrNFe nfe, IFormFile xmlNFe)
        {
            if (!xmlNFe.FileName.EndsWith(".xml")) return BadRequest();

            using var stream = new StreamReader(xmlNFe.OpenReadStream());
            nfe.CarregarXML(await stream.ReadToEndAsync());

            var codigo = Guid.NewGuid();
            var path = Path.GetTempPath();
            var nomeArquivo = $@"{codigo}.pdf";

            nfe.Config.Principal.TipoResposta = ACBrLib.Core.TipoResposta.fmtJSON;
            nfe.Config.Principal.CodificacaoResposta = ACBrLib.Core.CodResposta.UTF8;
            nfe.Config.Principal.LogNivel = ACBrLib.Core.NivelLog.logSimples;            
            nfe.Config.Principal.LogPath = "C:\\Dados\\AcbrApi\\";            

            nfe.Config.DANFe.MostraSetup = false;
            nfe.Config.DANFe.MostraPreview = false;
            nfe.Config.DANFe.MostraStatus = false;
            nfe.Config.DANFe.PathPDF = path;
            nfe.Config.DANFe.NomeDocumento = nomeArquivo;

            nfe.ImprimirPDF();

            var fs = new FileStream(Path.Combine(path, nomeArquivo), FileMode.Open);


          

ACBrLibNFE-20221209.log 39 B · 4 downloads

Log praticamente nenhuma informação..
se você esta utilizando via memory, você precisa utilizar os métodos de ConfigGravarValor e ConfigGravar.. para ler informações em memory, utilize métodos ConfigLerValor e ConfigLer.
https://acbr.sourceforge.io/ACBrLib/ConfiguracoesdaBiblioteca16.html

tenha certeza de que esta utilizando versão multithread da acbrlib.. e access violation geralmente acontece quando você esta tentando acessar algo na memoria que não existe ou já foi destruída.

Link para o comentário
Compartilhar em outros sites

  • 5 semanas depois ...

Estou conseguindo gerar  apenas o Log simples, que não serve nesse caso para nada.
Ainda não consegui fazer gerar os logNormal, logCompleto, logParanoico. Sem esse log não consigo prosseguir com erro que realmente , gostaria de ajuda.kkk
Estou usando o exemplo de C# Api de vcs do SVN configurado em "Memory".Mudei  o código como exemplo abaixo, para  que fosse salvo o log completo ou Paranoico mas não resolveu:

            var codigo = Guid.NewGuid();
            var path = "C:\\FolderHANDpaper\\NFe\\";
            var nomeArquivo = $@"{codigo}.pdf";
            
            nfe.ConfigGravarValor(ACBrLib.Core.ACBrSessao.Principal, "LogNivel", 4);
            nfe.ConfigGravarValor(ACBrLib.Core.ACBrSessao.Principal, "LogPath", path);
            nfe.ConfigGravarValor(ACBrLib.Core.ACBrSessao.DANFE, "MostraSetup", false);
            nfe.ConfigGravarValor(ACBrLib.Core.ACBrSessao.DANFE, "MostraPreview", false);
            nfe.ConfigGravarValor(ACBrLib.Core.ACBrSessao.DANFE, "MostraStatus", false);
            nfe.ConfigGravarValor(ACBrLib.Core.ACBrSessao.DANFE, "PathPDF", path);
            nfe.ConfigGravarValor(ACBrLib.Core.ACBrSessao.DANFE, "NomeDocumento", nomeArquivo);
            nfe.ConfigGravarValor(ACBrLib.Core.ACBrSessao.DANFE, "MargemDireita", 1);
            nfe.ConfigGravarValor(ACBrLib.Core.ACBrSessao.Principal, "TipoResposta", ACBrLib.Core.TipoResposta.fmtINI);
            nfe.ConfigGravarValor(ACBrLib.Core.ACBrSessao.Principal, "CodificacaoResposta", ACBrLib.Core.CodResposta.UTF8);
            nfe.Config.PathSchemas = "C:\\FolderHANDpaper\\NFe";            
            nfe.ConfigGravar($"C:\\FolderHANDpaper\\NFe\\{codigo}.ini");
            nfe.ConfigLer($"C:\\FolderHANDpaper\\NFe\\{codigo}.ini");

            nfe.CarregarXML(await stream.ReadToEndAsync());
            nfe.ImprimirPDF();

Editado por rael
Link para o comentário
Compartilhar em outros sites

  • Consultores
2 minutos atrás, rael disse:

"System.ApplicationException: Division by zero"

@rael legal, vamos lá ! 
o -10 quer dizer que houve erro ao tentar gerar o PDF, fazendo algumas pesquisar sobre o Exception, o mesmo quer dizer que:
"System.ApplicationException: Division by zero" é uma mensagem de erro que indica que você está tentando dividir um número por zero, esse erro geralmente ocorre quando o código tenta dividir um número por uma variável que possui o valor de zero.
Para correção, veja no código que a variável usada como divisor não possui o valor de zero.

Link para o comentário
Compartilhar em outros sites

Obrigado pela rápida atenção!
Sim  entendi essa parte de ser um valor divido por zero.
Mas gostaria que você atentasse para as seguintes informações:
Estou usando a API de exemplo de vcs, essa mesma do vídeo do tutorial "Nova demonstração da ACBrLib utilizando API em C#",

Se eu fizer várias chamadas só que não ao mesmo tempo,uma em sequência da outra, ela gera todos os PDFs sem problemas.Só quando faço duas chamadas ao mesmo tempo é que tenho esse problema.
Então acredito que não seja nenhum valor de preenchimento , mas sim por está tentando gerar dois PDFs ao mesmo tempo, por algum motivo quando é ao mesmo tempo está dando esse erro.
Estou usando o Postman acessando a Api de exemplos de vcs.

 

 

Link para o comentário
Compartilhar em outros sites

Em 16/01/2023 at 08:21, rael disse:

Obrigado pela rápida atenção!
Sim  entendi essa parte de ser um valor divido por zero.
Mas gostaria que você atentasse para as seguintes informações:
Estou usando a API de exemplo de vcs, essa mesma do vídeo do tutorial "Nova demonstração da ACBrLib utilizando API em C#",

Se eu fizer várias chamadas só que não ao mesmo tempo,uma em sequência da outra, ela gera todos os PDFs sem problemas.Só quando faço duas chamadas ao mesmo tempo é que tenho esse problema.
Então acredito que não seja nenhum valor de preenchimento , mas sim por está tentando gerar dois PDFs ao mesmo tempo, por algum motivo quando é ao mesmo tempo está dando esse erro.
Estou usando o Postman acessando a Api de exemplos de vcs.

 

 

Só para deixar claro , Estou usando o Demo "ACBrLib\Demos\C#\ACBr.API\ACBr.API" ,
pois como vocês já deixaram claro em vários tópicos  é mais fácil de vocês ajudarem.

Peguei uma máquina zerada para não ter referências de outras libs, dicas de vocÊs mesmo.

Eu consigo gerar os pdf's normalmente, só quando é ao mesmo tempo , que esses erros começam a acontecer na realidade.
O erro vai mudando de acordo com o momento que o acesso é feito ao mesmo tempo: , ("System.ApplicationException: Division by zero" outras vezes "Accesses Violation")

Link para o comentário
Compartilhar em outros sites

  • 4 semanas depois ...
  • Consultores

@EDM Softwares tudo bem ?
Em conversa com o time ACBr entramos em um consenso quanto a definição da próxima etapa da análise da situação encontrada por você.
O que acontece é que o programa exemplo "ACBr.API" atual é um exemplo muito simples. Ele não está fazendo o controle de ponteiros para uso do ACBrLib em Multithread.
É preciso ajustá-lo para refletir a forma correta de se implementar a comunicação em Multithread.
Isso está na tarefa (#TK-271). Ela está em nosso backlog com alta prioridade, e será analisada assim que outras demandas com maior prioridade forem finalizadas.

No entanto isso não impede de você fazer a implementação correta e utilizar a ACBrLib em Multithread. A cada thread que você chamar, basta criar um ponteiro utilizando o método Lib_Inicializar. Daí use esse ponteiro como parâmetro nas chamadas dessa thread para a lib.

Assim que ajustarmos o exemplo retornaremos no tópico. Mas você pode criar novos tópicos para tirar dúvidas específicas sobre a implementação caso precise.

  • Curtir 3
Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...
  • Membros Pro

Estamos finalizando a implementação de uma API para emissão de NFe, no caso será utilizada por vários clientes, vi no exemplo q fizeram da API não controla as requisições em cada thread, e que vcs iram fazer um novo exemplo utilizando ponteiro. Queria saber se vcs já tem um exemplo, pq fiz a implementação em cima do exemplo atual disponibilizado.

Editado por izzyway
Errei o texto
Link para o comentário
Compartilhar em outros sites

  • Moderadores
20 minutos atrás, izzyway disse:

Estamos finalizando a implementação de uma API para emissão de NFe, no caso será utilizada por vários clientes, vi no exemplo q fizeram da API não controla as requisições em cada thread, e que vcs iram fazer um novo exemplo utilizando ponteiro. Queria saber se vcs já tem um exemplo, pq fiz a implementação em cima do exemplo atual disponibilizado.

basta criar uma fila no receber os comandos e mandar uma a uma que vai funcionar com a multithread

 

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

  • Daniel InfoCotidiano changed the title to ACBrLib - Erro demo ACBr.API GerarPDF - Multithreading
  • Consultores

Boa tarde!

Conforme informado mais acima, a sua demanda estava em nosso backlog, no entanto, a equipe precisou focar seus esforços em demandas de maior prioridade.

Vamos verificar a possibilidade de encaixar essa demanda em sprints futuras.

Durante esse período, como uma paliativo, peço que reveja a orientação que foi dada pelo @antonio.carlos sobre como proceder para usar em MT:

Citar

No entanto isso não impede de você fazer a implementação correta e utilizar a ACBrLib em Multithread.

A cada thread que você chamar, basta criar um ponteiro utilizando o método Lib_Inicializar. Daí use esse ponteiro como parâmetro nas chamadas dessa thread para a lib.
 Mas você pode criar novos tópicos para tirar dúvidas específicas sobre a implementação caso precise.

 

Consultor SAC ACBr

Diego Folieni
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...
  • Moderadores
1 hora atrás, Dionis Mendanha disse:

Boa tarde alguma novidade com relação ao erro mencionado no topico?

não mas tem a sugestão acima do Antonio basta seguir que resolve até que seja revisto

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

  • 3 meses depois ...
  • Consultores

Boa tarde.
A TK está em nosso backlog, no entanto, não houve possibilidade avanço da mesma devido a outras demandas.
Continuamos dependendo da disponibilidade dos consultores para implementação.

Assim que tivermos um posicionamento será informado aqui no forum.

Consultor SAC ACBr

Alexandre de Paula
Ajude o Projeto ACBr crescer - Assine o SAC                    

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  ícone Discórdia Discord   

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

 

 

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 135 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.