Duvidas sobre performance

Pessoal, boa tarde! XD

Tenho uma função que processa uma Carta de correção eletrônica. A função ta de boa, funcionando normal. Porém o tempo de processamento ta preocupante.
Queria uma sugestão sobre os resultados que estou tendo. Até acho que o problema e na resposta da SEFAZ que recebe meus parâmetros.

Fiz um esquema para pegar o tempo de cada tipo de operação que minha aplicação CCe executa para formar o envio do XML para a SEFAZ desejada.

Vou postar a classe main, e em seguida, os resultados que estou obtendo:

log4j:WARN No appenders could be found for logger (org.apache.axiom.om.util.StAX
Utils).
log4j:WARN Please initialize the log4j system properly.
Param: 541.0
LerXMLEnv 1.0
Certificado: 0.0
Assinatura 2278.0
CriaXMLAss 3.0
CriaXMLRet 3800.0
Tempo gasto: 6637.0

Pelo o que percebi, a demora nem é em questão de IO ou assinatura digital(esta geralmente não leva 1 segundo). Mas fiquei com dúvidas sobre esse erro que aparece sobre log4j. O que preciso fazer para essa mensagem pare de aparecer. Será que e esse tipo de aviso que ta fazendo o processamento levar 6 segundos e meio ou será que são as SEFAZ mesmo?

To nessa perguntação…hehe, porquê to imaginando um cliente executando uma rotina dessa para 1000 notas fiscais. Já penso 6.5 X 1000. Isso ia demorar mais de 30 minutos, algo intolerável pra quem precisa de resolver os problemas de imediato…hehe

Sinceramente, não sei como melhorar esse tempo.

Segue as classes que utilizo para processar minha CCe:

classe model:

package recepcao;

import br.inf.portalfiscal.www.nfe.wsdl.recepcaoevento.RecepcaoEventoStub;
import br.inf.portalfiscal.www.nfe.wsdl.recepcaoevento.RecepcaoEventoStub.NfeCabecMsg;
import br.inf.portalfiscal.www.nfe.wsdl.recepcaoevento.RecepcaoEventoStub.NfeCabecMsgE;
import br.inf.portalfiscal.www.nfe.wsdl.recepcaoevento.RecepcaoEventoStub.NfeDadosMsg;
import br.inf.portalfiscal.www.nfe.wsdl.recepcaoevento.RecepcaoEventoStub.NfeRecepcaoEventoResult;
import java.net.URL;
import java.security.Security;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.util.AXIOMUtil;

public class Recepcao {
    public String getRecepcaoEvento(String nfeDadosMsg, String vXML, 
            String codEstado, String http, String caminhoCertCliente, 
            String senhaCertCliente, String caminhoCasserts)
    {
        try
        {
            NfeCabecMsg nfeCabecMsg = new RecepcaoEventoStub.NfeCabecMsg();
            
            /*Código do Estado(UF)*/
            nfeCabecMsg.setCUF(codEstado);
            
            /*Versão do XML*/
            nfeCabecMsg.setVersaoDados(vXML);
            
            NfeCabecMsgE nfeCabecMsgE = new RecepcaoEventoStub.NfeCabecMsgE();
            nfeCabecMsgE.setNfeCabecMsg(nfeCabecMsg);
            
            
            /*XML de Consulta*/
            
            OMElement ome = AXIOMUtil.stringToOM(nfeDadosMsg.toString());
            NfeDadosMsg dadosMsg = new NfeDadosMsg();
            dadosMsg.setExtraElement(ome);
            
            /*Informações do Certificado Digital*/
            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.clearProperty("javax.net.ssl.keyStore");
            System.clearProperty("javax.net.ssl.keyStorePassword");
            System.clearProperty("javax.net.ssl.trustStore");

            System.setProperty("javax.net.ssl.keyStore", caminhoCertCliente);
            System.setProperty("javax.net.ssl.keyStorePassword", senhaCertCliente);

            System.setProperty("javax.net.ssl.trustStoreType", "JKS");
            System.setProperty("javax.net.ssl.trustStore", caminhoCasserts);
            
            URL url = new URL(http);
            
            RecepcaoEventoStub stub = new RecepcaoEventoStub(url.toString());
            NfeRecepcaoEventoResult result = stub.nfeRecepcaoEvento(dadosMsg, nfeCabecMsgE);
            
            //XML de Retorno da SEFAZ
            return result.getExtraElement().toString();
        }
        catch(Exception e)
        {
            throw new RuntimeException("Message:" + e.getMessage() + " Cause: " + e.getCause() );
        }
    }
}

Classe assinadora:


package assinador;

import java.io.*;
import java.security.InvalidAlgorithmParameterException;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import javax.xml.crypto.dsig.*;
import javax.xml.crypto.dsig.dom.DOMSignContext;
import javax.xml.crypto.dsig.keyinfo.KeyInfo;
import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory;
import javax.xml.crypto.dsig.keyinfo.X509Data;
import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
import javax.xml.crypto.dsig.spec.TransformParameterSpec;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Assinador 
{
    private static final String EVENTO = "evento";
    private static final String NFE = "NFe";
    private PrivateKey privateKey;
    private KeyInfo keyInfo;
    
    public String assinaEnvEvento(String xml, String certificado, String senha) 
            throws Exception 
    {
	Document document = documentFactory(xml);
	XMLSignatureFactory signatureFactory = XMLSignatureFactory.getInstance("DOM");
	ArrayList<Transform> transformList = signatureFactory(signatureFactory);
	loadCertificates(certificado, senha, signatureFactory);
        
	for (int i = 0; i < document.getDocumentElement().getElementsByTagName(EVENTO).getLength(); i++) 
            assinar(EVENTO, signatureFactory, transformList, privateKey, keyInfo, document, i);
	
	return outputXML(document);
    }
    
    public void assinar(String tipo, XMLSignatureFactory fac, 
            ArrayList<Transform> transformList, PrivateKey privateKey, 
            KeyInfo ki, Document document, int index) throws Exception 
    {
        NodeList elements = null;

	if (EVENTO.equals(tipo)) 
        {
            elements = document.getElementsByTagName("infEvento");
	}
	else 
        {
            elements = document.getElementsByTagName("infNFe");
	}
	org.w3c.dom.Element el = (org.w3c.dom.Element) elements.item(index);
	String id = el.getAttribute("Id");

	Reference ref = fac.newReference("#" + id, 
                fac.newDigestMethod(DigestMethod.SHA1, null), transformList, 
                null, null);

	SignedInfo si = fac.newSignedInfo(fac.newCanonicalizationMethod(
                CanonicalizationMethod.INCLUSIVE,
                (C14NMethodParameterSpec) null), fac
                .newSignatureMethod(SignatureMethod.RSA_SHA1, null),
                Collections.singletonList(ref));

	XMLSignature signature = fac.newXMLSignature(si, ki);

	DOMSignContext dsc = new DOMSignContext(privateKey, 
                document.getDocumentElement().getElementsByTagName(tipo).item(index));
	signature.sign(dsc);
    }
    
    public ArrayList<Transform> signatureFactory(
            XMLSignatureFactory signatureFactory)
            throws NoSuchAlgorithmException, InvalidAlgorithmParameterException 
    {
	ArrayList<Transform> transformList = new ArrayList<Transform>();
	TransformParameterSpec tps = null;
	Transform envelopedTransform = signatureFactory.newTransform(
                Transform.ENVELOPED, tps);
        Transform c14NTransform = signatureFactory.newTransform(
                "http://www.w3.org/TR/2001/REC-xml-c14n-20010315", tps);

	transformList.add(envelopedTransform);
	transformList.add(c14NTransform);
        
	return transformList;
    }
    
    public Document documentFactory(String xml) throws SAXException, 
            IOException, ParserConfigurationException 
    {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        Document document = factory.newDocumentBuilder().parse(
        new ByteArrayInputStream(xml.getBytes()));
        
        return document;
    }
    
    public void loadCertificates(String certificado, String senha,
            XMLSignatureFactory signatureFactory) throws Exception 
    {
        InputStream entrada = new FileInputStream(certificado);
	KeyStore ks = KeyStore.getInstance("pkcs12");
	try 
        {
            ks.load(entrada, senha.toCharArray());
	}
        catch (IOException e) 
        {
            throw new Exception("Senha do Certificado Digital incorreta ou Certificado inválido.");
	}

	KeyStore.PrivateKeyEntry pkEntry = null;
	Enumeration<String> aliasesEnum = ks.aliases();
	while (aliasesEnum.hasMoreElements()) 
        {
            String alias = (String) aliasesEnum.nextElement();
            if (ks.isKeyEntry(alias)) 
            {
                pkEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(alias,
                new KeyStore.PasswordProtection(senha.toCharArray()));
                privateKey = pkEntry.getPrivateKey();
		break;
            }
	}
	X509Certificate cert = (X509Certificate) pkEntry.getCertificate();
	//info("SubjectDN: " + cert.getSubjectDN().toString());
	KeyInfoFactory keyInfoFactory = signatureFactory.getKeyInfoFactory();
	List<X509Certificate> x509Content = new ArrayList<X509Certificate>();
        
	x509Content.add(cert);
	X509Data x509Data = keyInfoFactory.newX509Data(x509Content);
	keyInfo = keyInfoFactory.newKeyInfo(Collections.singletonList(x509Data));
    }
    
    public String outputXML(Document doc) throws TransformerException 
    {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
	TransformerFactory tf = TransformerFactory.newInstance();
	Transformer trans = tf.newTransformer();
	trans.transform(new DOMSource(doc), new StreamResult(os));
	String xml = os.toString();
	if ((xml != null) && (!"".equals(xml))) 
        {
            xml = xml.replaceAll("\\r\\n", "");
            xml = xml.replaceAll(" standalone=\"no\"", "");
	}
	
        return xml;
    }
    
    public String lerXML(String fileXML) throws IOException 
    {
        String linha = "";
	StringBuilder xml = new StringBuilder();

	BufferedReader in = new BufferedReader(new InputStreamReader(
                new FileInputStream(fileXML)));
	while ((linha = in.readLine()) != null) 
        {
            xml.append(linha);
	}
	in.close();

	return xml.toString();
    }
    
    public void error(String error) 
    {
        System.out.println("| ERROR: " + error);
    }
    
    public void info(String info) 
    {
        System.out.println("| INFO: " + info);
    }	
}

E por último a classe que executa a aplicação:


package recepcaoevento;

import assinador.Assinador;
import java.io.BufferedWriter;
import java.io.FileWriter;
import model.Param;
import model.XML;

public class RecepcaoEvento {

    public static void main(String[] args) 
    {
        double inicio = System.currentTimeMillis();
        double fim = 0;
        double iniParam = 0;
        double fimParam = 0;
        double inienvXML = 0;
        double fimenvXML = 0;
        double iniCert = 0;
        double fimCert = 0;
        double iniAssina = 0;
        double fimAssina = 0;
        double iniCXMLAss = 0;
        double fimCXMLAss = 0;
        double iniCRSEFAZ = 0;
        double fimCRSEFAZ = 0;
        
        Assinador assinaXML = new Assinador();
        try
        {   
            iniParam = System.currentTimeMillis();
            String caminhoXMLParam = args[0];
            
            Param p = new XML().getParams(caminhoXMLParam);
            
            String caminhoXML = p.getCaminhoXml();
            fimParam = System.currentTimeMillis();
            
            inienvXML = System.currentTimeMillis();
            String XMLEnvio = assinaXML.lerXML(caminhoXML);
            fimenvXML = System.currentTimeMillis();
            
            iniCert = System.currentTimeMillis();
            String caminhoCertCliente = p.getAlias();
            String senhaCertCliente = p.getSenha();
            fimCert = System.currentTimeMillis();
            
            iniAssina = System.currentTimeMillis();
            String XMLEnvioAssinado = assinaXML.assinaEnvEvento(
                    XMLEnvio, caminhoCertCliente, senhaCertCliente);
            fimAssina = System.currentTimeMillis();
            
            iniCXMLAss = System.currentTimeMillis();
            
            FileWriter XMLEnvAss = new FileWriter(p.getCaminhoXml());
            BufferedWriter oXMLAss = new BufferedWriter(XMLEnvAss);
            oXMLAss.write(XMLEnvioAssinado);
            
            oXMLAss.close();
            
            fimCXMLAss = System.currentTimeMillis();
            
            iniCRSEFAZ = System.currentTimeMillis();
            
            FileWriter fileWriter = new FileWriter(args[0]);
            BufferedWriter out = new BufferedWriter(fileWriter);
            out.write("ok");
            out.newLine();
            
            
            out.write(new recepcao.Recepcao().getRecepcaoEvento(XMLEnvioAssinado, "1.00", p.getUf(), 
                    p.getUrl(), caminhoCertCliente, senhaCertCliente, "D:\\NFeCacerts"));
            out.newLine();
            out.close();
            
            fimCRSEFAZ = System.currentTimeMillis();
            
        }
        catch(Exception e)
        {
            e.printStackTrace();
            assinaXML.error("| " + e.toString());
        }
        finally
        {
            fim = System.currentTimeMillis();
            double tempo = fim - inicio;
            System.out.println("Param: " + (fimParam - iniParam));
            System.out.println("LerXMLEnv " + (fimenvXML - inienvXML));
            System.out.println("Certificado: " + (fimCert - iniCert));
            System.out.println("Assinatura " + (fimAssina - iniAssina));
            System.out.println("CriaXMLAss " + (fimCXMLAss - iniCXMLAss));
            System.out.println("CriaXMLRet " + (fimCRSEFAZ - iniCRSEFAZ));
            System.out.println("Tempo gasto: " + tempo);
        }
    }
}

Sei que o problema é meio que “óbvio”, mas…hehe
Qualquer dica agradeço :smiley:

essa mensagem aparece porque o log4j nao esta configurado, isso nao interfere no desempenho.

[]'s

esqueci rss

para a mensagem parar de aparecer, coloque:

BasicConfigurator.configure();

no inicio da aplicação que o log ira aparecer por completo.

[quote=mauricioadl]essa mensagem aparece porque o log4j nao esta configurado, isso nao interfere no desempenho.

[]'s[/quote]

Valeu pela dica, mauricioadl :smiley:

Não “faça esquemas”. Use um profiler:
http://profiler.netbeans.org/

[quote=ViniGodoy]Não “faça esquemas”. Use um profiler:
http://profiler.netbeans.org/[/quote]

Obrigado pela dica! :smiley: