Ir para conteúdo
  • Cadastre-se

dev botao

Problema ao Imprimir com Multi-Thread


Ver Solução Respondido por CONCEPT AUTOMACAO,
  • Este tópico foi criado há 464 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro
Postado (editado)

No projeto em Java utilizo o posPrinter MT - Cdecl.

Meu projeto é uma API feita utilizando o SpringBoot. Nela há um método de Post que imprime o Consumo.

Quando há somente um Thread imprimindo não da erro, o problema começa quando há vários thread imprimindo ao mesmo tempo. 

O problema parece estar relacionada a quantidade de thread, pois ao aumentar o numero de thread o problema se torna mais frequente.

Em um teste que eu fiz utilizando o Postman, durante 1 min e 4 usuario deu 123 solitacoes e 5 erros. Fiz o teste de ping com a impressora durante 30s e não teve perda de pacote. Ao ativar o LogNivel e LogPath as consultas ficaram mais lentas.

Os arquivos e logs em anexo são referente ao ultimo teste feito, com 5 usuário em 1 minuto. Tanto da minha applicacao quanto do componente da ACBR.codigo.txt

ACBrLibPosPrinter-20230818.log logimp.log ComandaServer.log

Editado por CONCEPT AUTOMACAO
Escrevi errado
  • Consultores
Postado
28 minutos atrás, CONCEPT AUTOMACAO disse:

No projeto em Java utilizo o posPrinter MT - Cdecl.

Meu projeto é uma API feita utilizando o SpringBoot. Nela há um método de Post que imprime o Consumo.

Quando há somente um Thread imprimindo não da erro, o problema começa quando há vários thread imprimindo ao mesmo tempo. 

O problema parece estar relacionada a quantidade de thread, pois ao aumentar o numero de thread o problema se torna mais frequente.

Em um teste que eu fiz utilizando o Postman, durante 1 min e 4 usuario deu 123 solitacoes e 5 erros. Fiz o teste de ping com a impressora durante 30s e não teve perda de pacote. Ao ativar o LogNivel e LogPath as consultas ficaram mais lentas.

Os arquivos e logs em anexo são referente ao ultimo teste feito, com 5 usuário em 1 minuto. Tanto da minha applicacao quanto do componente da ACBR.codigo.txt

ACBrLibPosPrinter-20230818.log 490.02 kB · 0 downloads logimp.log 36.87 kB · 0 downloads ComandaServer.log 33.89 kB · 0 downloads

Analisei o log, único erro que encontrei foi
18/08/23 10:24:12:680 -    SetRetorno(-10, Synapse TCP/IP Socket error 10054: Connection reset by peer)

-10 Indica que houve erro ao ativar o ACBrPosPrinter, olhando a mensagem de retorno, parece um erro de conexão..

Pesquisando no fórum, veja se nas configurações ACBrLib.ini a propriedade ControlePorta = true, veja se resolve..
https://acbr.sourceforge.io/ACBrLib/ConfiguracoesdaBiblioteca.html

  • Curtir 1
  • Consultores
Postado

@antonio.carlos
Realizamos alguns testes no discord, uma das orientações sobre esta mensagem que ele está recebendo é esta que vc citou.
https://discord.com/channels/798697718800318484/800922605414383636/1142088324333453352
Foi solicitado este mesmo teste, mas ele informou que persiste o erro mesmo assim.



 

 

Consultor SAC ACBr

Daniel de Morais (Infocotidiano)
Ajude o Projeto ACBr crescer - Assine o SAC

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

  • Membros Pro
Postado

Eu fiz uma alteração para teste que parece ter resolvido. Ao colocar um Sleep após a impressão e desativação da impressora, ele reduziou a quantidade de vezes que dava erro, fiz 700 solicitações e só me retornou 2 erros.

  • Curtir 2
  • Membros Pro
  • Solution
Postado

@antonio.carlos @Daniel InfoCotidiano
Parece que meu problema era em instanciar e chamar os métodos do componente consecutivamente ele sobrecarregava, ainda mais por estar em Thread e no mesmo momento pode ter várias comunicações simultâneas, ao coloca o sleep no Thread atual, ele parou de me apresentar esse problema.

private void imprimirPrinter(Impressora imp,String conteudo,ACBrPosPrinter posPrinter) throws Exception {
        posPrinter.imprimir(conteudo);
        try {
            Thread.currentThread().sleep(500);            
        } catch (InterruptedException ex) {
            log.error("Erro no Sleep: "+ex.getMessage(),ex);
        }
    }
    
    private void desativarPrinter(Impressora imp,ACBrPosPrinter posPrinter) {
        log.info(String.format("Desativando Printer: '%s'",imp.getNome()));
        try {
            posPrinter.desativar();
        } catch (Exception ex) {
            log.error("Erro ao desativar: " + ex.getMessage(), ex);
        } 
        
        try {
            Thread.currentThread().sleep(500);            
        } catch (InterruptedException ex) {
            log.error("Erro no Sleep: "+ex.getMessage(),ex);
        }
    }    

Minhas consultas está demorando 1s a mais porem parou o erro com a comunicação.

  • Curtir 4
  • Fundadores
Postado

@CONCEPT AUTOMACAO, notei que você configurou a impressora para ser acessada por Porta TCP

   18/08/23 10:24:02:543 - LIB_ConfigGravarValor(PosPrinter, Porta, TCP:192.168.1.72:9100)

A impressora tem embutido, um Servidor TCP, mas ela não conseguirá tratar conexões simultâneas, ou fará filas ou semáforos...

O Erro reportado, vem da conexão com a Impressora... e pode indicar que uma nova conexão a ela, derrubou a conexão anterior...

   18/08/23 10:24:12:680 -    SetRetorno(-10, Synapse TCP/IP Socket error 10054: Connection reset by peer)

Você precisa ter um mecanismo de Semáforos em sua implementação, para que apenas aThread consiga,

  • Bloquear o Semáforo,
  • enviar os dados para a impressora
  • liberar o Semáforo

Com isso, as demais Threads, entrariam na fila

  • Curtir 5
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

×
×
  • 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.