Ir para conteúdo
  • Cadastre-se

dev botao

Lib. do Acbr não executa em MultiThreads utilizando Node.js


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

Recommended Posts

Olá, conforme, foi passado no discord, segue a reprodução do erro ACBRLIB NFE que não executa em MT.

  • A lib. em single thread funciona perfeitamente
  • O propósito da execução do MT da lib. É criar uma API web que use todos os serviços da lib.
  • Cada requisição da API, end-point irá executar uma função da lib.
  • Ao executar várias requisições na situação 1, ela se comporta como um semáforo, esperando a primeira requisição terminar para as outras finalizar, em quanto não finaliza uma a outra continua em execução aguardando-a terminar.
  •  

Problema 1: A Lib. do Acbr não executa em MT, quando passado todos os parâmetros de pointer definindo um novo thread a mesma se comporta como um semáforo, esperando uma requisição termina para continuar a outra. 

Problema 2: Ao fazer o node executar MultiThreads com a função nativa do node worker_threads, quando executado requisições diferentes ele se comporta perfeitamente como o esperado, mas quando eu tento realizar a execução da mesma requisição ele acaba matando todas as requisições anulando-as completamente, sendo impossível de finalizar a requisição.

 

Citar

Informações de como reproduzir, junto com os arquivos necessários em anexo. LEIA O ARQUIVO Instruções.docx, lá contem todo o passo a passo para configurar o ambiente.

Link do Arquivo: https://stsw.com.br/exemplos-mt-acbr-lib.zip

 

 

 

Link para o comentário
Compartilhar em outros sites

  • Administradores

Tópico movido para a área do SAC, para que o SLA de respostas seja considerado

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

  • Consultores

Arquivos anexados:

exemplos-mt-acbr-lib.zip

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • Consultores

Realizando alguns testes aqui com o programa exemplo no C#, na versão MultiThread, veja:

Eu criei duas instancias da aplicação, ambos utilizando versão MT:
Instancia 1:
image.png

Veja o valor de libHandle, agora comparando com a instancia 2:
image.png

Cada um recebeu um valor diferente, possibilitando o uso de múltiplas instancias e chamadas dos métodos no programa exemplo..

e olhando o log:
07/12/22 11:15:16:582 - NFE_ObterCertificados
07/12/22 11:15:18:712 - NFE_ObterCertificados

Chamada do método praticamente ao mesmo tempo.

07/12/22 11:19:10:977 - LIB_UltimoRetorno
07/12/22 11:19:10:980 -    Codigo:0, Mensagem:
07/12/22 11:19:11:857 - LIB_UltimoRetorno
07/12/22 11:19:11:862 -    Codigo:0, Mensagem:

Detalhe, o tempo de 11:15 para 11:19 é porque estava em modo debug, por este motivo demorou alguns minutinhos para obter o retorno do método.

Não realizei testes em node, pois não conheço a linguagem, mas temos colegas na comunidade do ACBr que utilizam NodeJS, podem te ajudar no uso da lib versão multithread.

Tem exemplo no nosso SVN, foi contribuição da comunidade:
http://svn.code.sf.net/p/acbr/code/trunk2/Projetos/ACBrLib/Demos/Node.js/

Acredito que o mesmo não esteja em multithread, não sei se te ajuda também... 

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

5 horas atrás, antonio.carlos disse:

Realizando alguns testes aqui com o programa exemplo no C#, na versão MultiThread, veja:

Eu criei duas instancias da aplicação, ambos utilizando versão MT:
Instancia 1:
image.png

Veja o valor de libHandle, agora comparando com a instancia 2:
image.png

Cada um recebeu um valor diferente, possibilitando o uso de múltiplas instancias e chamadas dos métodos no programa exemplo..

e olhando o log:
07/12/22 11:15:16:582 - NFE_ObterCertificados
07/12/22 11:15:18:712 - NFE_ObterCertificados

Chamada do método praticamente ao mesmo tempo.

07/12/22 11:19:10:977 - LIB_UltimoRetorno
07/12/22 11:19:10:980 -    Codigo:0, Mensagem:
07/12/22 11:19:11:857 - LIB_UltimoRetorno
07/12/22 11:19:11:862 -    Codigo:0, Mensagem:

Detalhe, o tempo de 11:15 para 11:19 é porque estava em modo debug, por este motivo demorou alguns minutinhos para obter o retorno do método.

Não realizei testes em node, pois não conheço a linguagem, mas temos colegas na comunidade do ACBr que utilizam NodeJS, podem te ajudar no uso da lib versão multithread.

Tem exemplo no nosso SVN, foi contribuição da comunidade:
http://svn.code.sf.net/p/acbr/code/trunk2/Projetos/ACBrLib/Demos/Node.js/

Acredito que o mesmo não esteja em multithread, não sei se te ajuda também... 

Legal, pois eu já verifiquei todos os exemplos, e ainda nao conseguir fazer rodar em MT, eu vou preparar os testes com o log da lib pra verificar e comparar com esse teste que vc fez em C#.

nenhum dos exemplos em JS usa o MT, a execução normal em ST funciona perfeito. o problema mesmo e no uso e execução do MT.

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

  • Fundadores

@desdobrar, ainda estou tentando montar um ambiente para rodar e debugar...

Minha suspeita é que o Ponteiro da Lib, não está retornando de forma correta, devido a forma como os parâmetros estão sendo passados... Ainda estou estudando sobre o assunto, no tutorial da FFI

https://github.com/node-ffi/node-ffi/wiki/Node-FFI-Tutorial

 

Notei que em nosso Discord, tem um outro usuário que está usando com sucesso a versão MT com Node.js

https://discord.com/channels/798697718800318484/798966420243349527/1029496508904636467

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.

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Daniel Simoes disse:

@desdobrar, ainda estou tentando montar um ambiente para rodar e debugar...

Minha suspeita é que o Ponteiro da Lib, não está retornando de forma correta, devido a forma como os parâmetros estão sendo passados... Ainda estou estudando sobre o assunto, no tutorial da FFI

https://github.com/node-ffi/node-ffi/wiki/Node-FFI-Tutorial

 

Notei que em nosso Discord, tem um outro usuário que está usando com sucesso a versão MT com Node.js

https://discord.com/channels/798697718800318484/798966420243349527/1029496508904636467

O Luiz Augusto, está exatamente com o mesmo problema que eu, ele tbm não conseguiu implementar o MT com nodejs, já conversei com ele e passei minha evolução, ele que percebeu que realmente a minha primeira implementação não executava em MT, executa como uma fila.

Tentei executar criando uma alocação do tipo int com 4 bytes conforme vc informou;

let handle = ref.alloc(ref.types.int, 4);

essa é a forma como eu recebo o ponto pra passar pras outras funções.

handle = ref.readPointer(handle, 0, 4);

porem tbm sem sucesso!

Eu tbm estou acreditando que o problema esteja com esse ponto de identificação, existe algo errado com ele, ou ele não reescreve ou ele sempre cria o mesmo ponto sempre.

Editado por desdobrar
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

12 horas atrás, antonio.carlos disse:

Daniel Simões esta analisando, pode demorar alguns dias, isso pode ser uma limitação do NodeJS ou da biblioteca FFI que o NodeJS utiliza para carregar as DLLs 

Entendi, joia, em quanto isso, eu vou procurar outras alternativas pra tentar se comunicar com a lib usando node.

Link para o comentário
Compartilhar em outros sites

  • Solution

Boa tarde, achamos o problema, o @CODIGO SISTEMAS LTDA Luiz Augusto, conseguiu achar o problema.

basicamente o problema era na execução e criação do pointer, segue como foi solucionado.

A chamada da Lib ficou assim

let handlePtr = ref.refType('int');

const libm = ffi.Library(pathDllACBrLibNFe, {

    NFE_Inicializar: ['int', [handlePtr, 'string', 'string']],
  
    NFE_Finalizar: ['int', [handlePtr]],
    NFE_UltimoRetorno: ['int', [handlePtr, 'string', 'string']],
    NFE_Nome: ['int',[handlePtr, 'string','string']],
    NFE_Versao: ['int', [handlePtr, 'string','string']],
  
    NFE_ConfigLer: ['int', [handlePtr, 'string']],
    NFE_ConfigGravar: ['int', [handlePtr, 'string']],
    NFE_ConfigLerValor: ['int',[handlePtr,'string','string','string','string']],
    NFE_ConfigGravarValor: ['int', [handlePtr, 'string', 'string', 'string']],
    NFE_ConfigImportar: ['int',[handlePtr, 'string']],
    NFE_ConfigExportar: ['int',[handlePtr, 'string','string']],
  
    NFE_ObterCertificados: ['int',[handlePtr, 'string','string']],
    NFE_CarregarXML: ['int', [handlePtr, 'string']], 
    NFE_SalvarPDF: ['int',[handlePtr, 'string','string']],
  
});

 

A execução da inicialização ficou assim:

let handle = ref.alloc(handlePtr);

libm.NFE_Inicializar(handle, '', eChaveCrypt);
handle = handle.deref();

 

e os demais métodos vc chama da mesma forma

libm.NFE_ConfigGravarValor(handle, 'Principal', 'TipoResposta', '2');

OBS: a execução em node ainda depende da funcionalidade worker_threads, pois ainda precisa fazer o node executar varias instancias. ainda estou finalizando os testes e logo mais estarei criando um exemplo bem limpo e objetivo pra poder ser anexado nos exemplos em node js. Obrigado! 

  • Curtir 5
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • Fundadores

@desdobrar, que fantástica a iniciativa de vocês...

Eu estava quebrando a cabeça com essa inicialização.. e como não sou nativo em Node.Js, estava apanhando...

Ficarei muito grato por toda essa ajuda, e pela a elaboração de um Demo compatível com Multi Thread...

Posso enviar um brinde do ACBr a vocês e para o @CODIGO SISTEMAS LTDA ?

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.

Link para o comentário
Compartilhar em outros sites

4 minutos atrás, Daniel Simoes disse:

@desdobrar, que fantástica a iniciativa de vocês...

Eu estava quebrando a cabeça com essa inicialização.. e como não sou nativo em Node.Js, estava apanhando...

Ficarei muito grato por toda essa ajuda, e pela a elaboração de um Demo compatível com Multi Thread...

Posso enviar um brinde do ACBr a vocês e para o @CODIGO SISTEMAS LTDA ?

Nossa, muito obrigado, pode sim!

ainda estamos tentando fazer funcionar no linux, parece que o ponteiro que rodou no windows não funciona no linux, estamos tentando achar uma solução. assim que conseguir fazer funcionar no linux posto aqui a resolução e logo em seguida mando os exemplos limpos e documentados de como rodar em ambas as plataformas. 

Link para o comentário
Compartilhar em outros sites

Estamos passando pelo seguinte problema na hora de executar varias reqs ao mesmo tempo: Segmentation fault

quando executamos uma unica req no linux ela funcionar perfeitamente, agora quando executa varias reqs diferentes ou iguais ao mesmo tempo acontece esse erro, alguém sabe algum caminho?

Link para o comentário
Compartilhar em outros sites

  • Fundadores

no Windows você testou com a versão 64 bits ?

Pode ser que você precise de um handle com mais Bytes, em 64 bits... Não sei se o comando abaixo é válido.. algo como:

let handlePtr = ref.refType('long');
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.

Link para o comentário
Compartilhar em outros sites

Agora, Daniel Simoes disse:

no Windows você testou com a versão 64 bits ?

Pode ser que você precise de um handle com mais Bytes, em 64 bits... Não sei se o comando abaixo é válido.. algo como:

let handlePtr = ref.refType('long');

isso, foi usada a Cdecl\ACBrNFe64.dll,

vou tentar colocar mais Bytes e fazer mais testes.

Link para o comentário
Compartilhar em outros sites

19 minutos atrás, desdobrar disse:

isso, foi usada a Cdecl\ACBrNFe64.dll,

vou tentar colocar mais Bytes e fazer mais testes.

Sem sucesso, esses foram os erros que apareceu ao longo de varios testes relacionados a essa mensagem: Segmentation fault

veja se você reconhece algum pra termos uma noção pra onde seguir!

ERROR in code: TGtk2WidgetSet.CreateBitmapFromRawImage Incompatible DataSize
Creating gdb catchable error:

  $00007FBA8C695028
  $00007FBA8C692BB5
  $00007FBA8C7512B1
  $00007FBA8C67ECEC
  $00007FBA8C6CE048
  $00007FBA8C6D3E87
  $00007FBA8C6D873E
  $00007FBA8C6DBB64
  $00007FBA8C6E563E
Floating point exception


---------------------------

node: ../../src/xcb_io.c:533: _XAllocID: Assertion `ret != inval_id' failed.
Aborted

---------------------------

[xcb] Unknown request in queue while dequeuing
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
node: ../../src/xcb_io.c:163: dequeue_pending_request: Assertion `!xcb_xlib_unknown_req_in_deq' failed.
node: Fatal IO error 11 (Resource temporarily unavailable) on X server :1.
Aborted


[xcb] Unknown request in queue while dequeuing
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
node: Fatal IO error 11 (Resource temporarily unavailable) on X server :1.
node: ../../src/xcb_io.c:163: dequeue_pending_request: Assertion `!xcb_xlib_unknown_req_in_deq' failed.
Aborted

node: Fatal IO error 2 (No such file or directory) on X server :1.
[TGtk2WidgetSet.Destroy] WARNING: There are 2 unreleased GDIObjects, a detailed dump follows:
[TGtk2WidgetSet.Destroy]   GDIOs: 00007F529EA460C0 00007F529F0B3940
[TGtk2WidgetSet.Destroy]   gdiBitmap: 2

[TGtk2WidgetSet.Destroy] WARNING: There are 1 unreleased GDIObjects, a detailed dump follows:

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

isso me chamou atenção... é algo que possa ser chamado no seu código de inicialização ?

[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
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.

Link para o comentário
Compartilhar em outros sites

22 minutos atrás, Daniel Simoes disse:

isso me chamou atenção... é algo que possa ser chamado no seu código de inicialização ?

[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called

não, acredito que seja relacionado a lib ou as dependências dela, pois eu testei o worker_threads sem a chamada da lib e o carregamento e funcionamento de varias reqs ao mesmo tem funcionando normalmente.

Link para o comentário
Compartilhar em outros sites

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