Pesquisar na Comunidade
Showing results for tags 'multithread'.
Encontrado 2 registros
-
Problemas ao utlizar acbr multithread com servidor web
um tópico no fórum postou Dev Comercial DFe - Documentos Fiscais Eletrônicos
Bom dia. Estamos desenvolvendo uma API golang utilizando o ACBrLib para emissão de MDFe. Para isso funcionar precisamos desenvolver uma interface em golang para chamar as funções da so (Estamos usando linux). Já é possivel chamar as funções do ACBrLib e transmissões, porém temos um problema. Ao tentar usar a biblioteca multithread fazendo multiplas requisições (simuladas com a AB), a aplicação quebra de forma intermitente. Todas as vezes que ela quebra está relacionado a falha de segmentação que vem da lib. A estrutura de canais para controlar o multhread desenvolvida no golang está funcional, iniciamos a biblioteca e usamos a função desejada. Existe alguma limitação para o uso da biblioteca multithread? Existe alguma coisa que esquecemos de usar ao chamar as funções do ACBrLib? Alguém já teve essa experiencia de usar o ACBrLib para desenvolver uma API multithread para emissão de algum documento fiscal? Abaixo segue um trecho do código desenvolvido para a aplicação. func (p poolLib) Status() string { return p.seletor() } func (p *poolLib) seletor() string { var lib uintptr lib = <-liver usando <- lib status := p.acbr.Status(lib) lib = <-usando liver <- lib return status } func NewPool(libacbr Dominio.IEnviar) Poollib { chLivre := make(chan uintptr, 4) chUsado := make(chan uintptr, 4) for i := 0; i < 4; i++ { var ptr uintptr libacbr.Init(&ptr) chLivre <- ptr } liver = chLivre usando = chUsado return &poolLib{ acbr: libacbr, } } Chamada a função delegada da lib func (m MDFe) callStatus(uintptr2 uintptr) string { bytes := m.bufferNew() versao := m.versao(uintptr2, bytes, &m.tamanho) return strconv.Itoa(versao) } Estamos usando a função versão para teste a comunicação com lib para evitar chamadas desnecessárias a sefaz -
O usuário do discord GEW Tecnologia reportou sucesso ao implementar a ACBrLibNFe Multithread (MT) com o Node, fez da seguinte forma: export const AcbrNfe = ffi.Library(libPath, { NFE_Inicializar: ['int', ['pointer', 'string', 'string']], NFE_Finalizar: ['int', ['pointer']], NFE_ConfigGravarValor: ['int', ['pointer', 'string', 'string', 'string']], NFE_CarregarINI: ['int', ['pointer', 'string']], NFE_ObterXml: ['int', ['pointer', 'int', 'string', 'string']], NFE_Enviar: ['int', ['pointer', 'int', 'bool', 'bool', 'bool', 'string', 'string']], NFE_EnviarEmail: ['int', ['pointer', 'string', 'string', 'bool', 'string', 'string', 'string', 'string']], }); import * as ref from 'ref-napi'; import { AcbrNfe } from 'src/config/acbrlib/ffi/nfe.ffi'; let handle = ref.alloc('pointer'); AcbrNfe.NFE_Inicializar(handle, eArqConfig, eChaveCrypt); handle = ref.readPointer(handle, 0, 8192); AcbrNfe.NFE_ConfigGravarValor(handle, item.sessao, item.chave, item.valor); AcbrNfe.NFE_CarregarINI(handle, conteudoIni); AcbrNfe.NFE_ObterXml(handle, 0, alocResposta, alocTamanho); AcbrNfe.NFE_Enviar(handle, numeroLote, imprimirDanfe, enviarEmModoSincrono, enviarArquivoZipado, alocResposta, alocTamanho); AcbrNfe.NFE_EnviarEmail(handle, dadosEmail.destinatario, dadosEmail?.conteudoXml, dadosEmail.isEnviarPdf, dadosEmail.assunto, dadosEmail?.cc, dadosEmail?.anexos, dadosEmail.mensagem); AcbrNfe.NFE_Finalizar(handle); Ele baixou este exemplo: https://stsw.com.br/exemplos-mt-acbr-lib.zip Ele cita estes 2 postes como base de conhecimento. Link da postagem oficial do discord, clique aqui Obrigado GEW Tecnologia pela colaboração !