NFe - Validação de Consulta ao Web Service

4 respostas
Isaiaslima15

Estou trabalhando em um sistema de emissor de Nfe, não participei da sua construção então não entendo muito da regra de negócio e também sou inexperiente com webservice.

A problematica é essa regra de validação que eu vou por abaixo:

“As empresas que construírem um aplicativo que se mantenha em “loop” permanente de
consulta a este Web Service, devem aguardar um tempo mínimo de 3 minutos entre cada
consulta, evitando sobrecarregar desnecessariamente os servidores da SEFAZ.”

tenho um método que protocola essa comunicação , ele é chamado toda vez que entro na Home do Sistema, tenho que fazer com que ele entre em um Loop e que espere sempre 5 minutos antes de consultar novamente, mesmo se eu atualizar a página.

Não tenho noção de como fazer isso, me deram a Ideia de trabalhar com Threads, mas não conheço muito .

4 Respostas

RaulCrash

Esta regra de intervalo é por IP ou por certificado A1? Tipo IP x pode fazer de 5 em 5 minutos request ou p/ cada certificado A1 (Empresa) o interval de 5 minutos por request?

Isaiaslima15

Certificado , eu acho.

if (ConfiguracaoNFe.getTipoCertificado().equals(EnumCertificadoDigital.A1.getTipo())) {
						String caminhoDoCertificadoDoCliente = ConfiguracaoNFe.getLocalCertificadoA1();
						String senhaDoCertificadoDoCliente = ConfiguracaoNFe.getSenhaCertificado();
						FacesContext context = FacesContext.getCurrentInstance();
						String configName = context.getExternalContext().getRealPath(Constantes.CAMINHO_REPOSITORIO_ARQUIVOS_SISTEMA)
								+ File.separator;
						String arquivoCacertsGeradoTodosOsEstados = configName + ConfiguracaoNFe.nome_arquivo_cacerts_homologacao;
						//
						System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
						Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
						System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
						System.setProperty("javax.net.ssl.keyStore", caminhoDoCertificadoDoCliente);
						System.setProperty("javax.net.ssl.keyStorePassword", senhaDoCertificadoDoCliente);
						System.setProperty("javax.net.ssl.trustStoreType", "JKS");
						System.setProperty("javax.net.ssl.trustStore", arquivoCacertsGeradoTodosOsEstados);
						//
					} else {
						//
						String senhaDoCertificado = ConfiguracaoNFe.getSenhaCertificado();
						FacesContext context = FacesContext.getCurrentInstance();
						String configName = context.getExternalContext().getRealPath(Constantes.CAMINHO_REPOSITORIO_ARQUIVOS_SISTEMA)
								+ File.separator;
						String arquivoCacertsGeradoTodosOsEstados = configName + ConfiguracaoNFe.nome_arquivo_cacerts_homologacao;
						//
						if (ConfiguracaoNFe.getTipoCertificado().equals(EnumCertificadoDigital.A3_CARTAO.getTipo())) {
							configName += ConfiguracaoNFe.nome_arquivo_smartcard_conf;
							System.setProperty("javax.net.ssl.keyStoreProvider", "SunPKCS11-SmartCard");
						} else {
							configName += ConfiguracaoNFe.nome_arquivo_token_conf;
							System.setProperty("javax.net.ssl.keyStoreProvider", "SunPKCS11-eToken");
						}

						Provider p = new sun.security.pkcs11.SunPKCS11(configName);
						Security.addProvider(p);
						char[] pin = senhaDoCertificado.toCharArray();
						KeyStore ks = KeyStore.getInstance("pkcs11", p);
						ks.load(null, pin);

						String alias = "";
						Enumeration<String> aliasesEnum = ks.aliases();
						while (aliasesEnum.hasMoreElements()) {
							alias = (String) aliasesEnum.nextElement();
							if (ks.isKeyEntry(alias))
								break;
						}

						System.setProperty("javax.net.ssl.keyStore", "NONE");
						System.setProperty("javax.net.ssl.keyStoreType", "PKCS11");
						System.setProperty("javax.net.ssl.keyStoreProvider", "SunPKCS11-SmartCard");

						System.setProperty("javax.net.ssl.trustStoreType", "JKS");
						System.setProperty("javax.net.ssl.trustStore", arquivoCacertsGeradoTodosOsEstados);

					}
					System.setProperty("https.protocols", "TLSv1");
					System.setProperty("jdk.tls.client.protocols", "TLSv1");

Esse metodo é chamado quando estou consultando o status da Sefaz, só quero que ele não seja chamado toda vez que eu voltar pra página , e sim só depois de 5 minutos que chamei pela ultima vez.

RaulCrash

Se for por certificado vc pode fazer este controle na sessão do usuário mesmo e toda vez que chamar os serviços vc atribui a hora que foi consultado, e antes do cara fazer outra vc valida se a hora que ele está solicitando está no intervalo da ultima requisição bem sucedida.

Isaiaslima15

Bom, eu acabei usando o Singleton para que a instancia ficasse sendo a mesma durante esse tempo, agora estou tentando encontrar uma forma de pegar os minutos de vida da minha instancia e quando ela for maior ou igual a três minutos a instancia ficar Null.

Mas o jeito que você falou parece mais simples e menos propenso a erros. obrigado.

Criado 25 de novembro de 2016
Ultima resposta 28 de nov. de 2016
Respostas 4
Participantes 2