Closed ronaldoalberton closed 3 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");
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.
@ronaldoalberton se possível compartilhe aqui a sua solução. Obrigado.
@ronaldoalberton Compartilhe, por favor. Quando vê é algo que podemos adicionar na própria lib pra todos poderem usar.
` 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 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.
@ronaldoalberton Só pra dar um feedback: mesmo com a sua solução, o erro continua acontecendo de forma aleatória no meu sistema.
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));