wmixvideo / nfe

Nota Fiscal Eletrônica em Java.
Apache License 2.0
656 stars 377 forks source link

Rejeição 223: CNPJ do transmissor do lote difere do CNPJ do transmissor da consulta - Utilizando cache de WSFacade #683

Closed ronaldoalberton closed 3 years ago

ronaldoalberton commented 4 years ago

Estou usando utilizando cache para vários CNPJs para o WSFacade, porém como o método abaixo é estático sempre fica o ultima cache carregado no SocketFactory

Protocol.registerProtocol("https", new Protocol("https", new DFSocketFactory(config), 443));

danielbohnrs commented 4 years ago

Bom dia @ronaldoalberton Aqui implementei pra desregistrar o protocolo após terminar de usar, dessa forma (até o momento tem funcionado como esperado):

com.fincatto.documentofiscal.nfe400.classes.lote.envio.NFLoteEnvioRetornoDados retorno = new com.fincatto.documentofiscal.nfe400.webservices.WSFacade(this.configuracaoNfe).enviaLote(lote); Protocol.unregisterProtocol("https");

ronaldoalberton commented 4 years ago

Tudo bem @danielbohnrs, achei uma outra solução. Criei uma classe extendendo de Protocol, e sobrescrevi o método getSocketFactory(). Desta forma eu consigo retornar o ProtocolSocketFactory do cliente que está usando a thread do java. Se quiser posso te compartilhar a solução.

rafaelTartigrado commented 4 years ago

@ronaldoalberton se possível compartilhe aqui a sua solução. Obrigado.

danielbohnrs commented 4 years ago

@ronaldoalberton Compartilhe, por favor. Quando vê é algo que podemos adicionar na própria lib pra todos poderem usar.

ronaldoalberton commented 4 years ago

` public abstract class NFeConfig extends DFConfig {

public Protocol createProtocol() throws UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
    return new Protocol("https", new DFSocketFactory(this), 443);
}

}

public class WSFacade {

public WSFacade(final NFeConfig config) throws KeyManagementException, UnrecoverableKeyException, KeyStoreException, NoSuchAlgorithmException {
    Protocol.registerProtocol("https", config.createProtocol());
}

}

public class LiveNfeConfig extends NFeConfig {

private static final Map<String, ProtocolSocketFactory> SOCKET_FACTORY_MAP = new HashMap<>();

@Override
public Protocol createProtocol() throws UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException {

    //Cria no factory e adiciona no MAP os DFSocketFactory de cada cliente com um identificador
    final DFSocketFactory factory = new DFSocketFactory(this);

    String identifier = String.valueOf(SessionTenantContextHolder.get().get("organization_id"));

    SOCKET_FACTORY_MAP.put(identifier, factory);

    return new Protocol("https", factory, 443) {
        @Override
        public ProtocolSocketFactory getSocketFactory() {

            //Busca o identificador da secao atual do spring para encontrar no map o DFSocketFactory correto
            String identifier = String.valueOf(SessionTenantContextHolder.get().get("organization_id"));

            return SOCKET_FACTORY_MAP.get(identifier);
        }

    };

}

}`

ronaldoalberton commented 4 years ago

@ronaldoalberton Compartilhe, por favor. Quando vê é algo que podemos adicionar na própria lib pra todos poderem usar.

Por hora esta em um fork que criei, vou abrir um mege para o repositorio, postei a solucao no comentário por hora.

danielbohnrs commented 3 years ago

@ronaldoalberton Só pra dar um feedback: mesmo com a sua solução, o erro continua acontecendo de forma aleatória no meu sistema.