PKCS11 erro em assinaturas sucessivas

Pessoal, estou finalizando um software emissor de NFe e como acompanhei e aprendi muito aqui no fórum, muitas pessoas tiveram problemas com assinatura digital, leitores de smart card entre outros. Um membro do fórum que me auxiliou bastante com codificação para assinatura da nfe (michelvalent/mv - valeu cara :-)). Acontece que tinha um código funcional que assinava tranquilamente, mas meu cliente passou a reclamar que uma vez ou outra o sistema não mais identificava o leitor de cartões, dai vinha aquele famoso erro do Provider, initialization filed… entre outros erros. Era como se o leitor sumisse. O michel me passou um trecho de código que ele utiliza sem problemas, testei na minha aplicação e funcionou sem problemas. Dai fui testar o que meu cliente sempre reclamava, após sucessivas assinaturas sem problemas do nada o sistema começava a aparentar o erro, então, reiniciava o tomcat e tudo voltava ao normal, pelo menos até as próximas assinaturas bem executadas.

Pus minha aplicação para executar testes unitários e BINGO! após aproximadamente 43 assinaturas bem executadas a classe SunPKCS11 lançava exceção. Repeti diversas vezes o teste e pesquise na web para localizar o erro.
Bem, em resumo, descobri que este tipo de erro deve-se ao seguinte trecho. (*obs: para quem utiliza este tipo de implementação).

String config = "name = eToken \n" + "library = " + "C:\\windows\\system32\\aetpkss1.dll";
ByteArrayInputStream is = new ByteArrayInputStream(config.getBytes());
--> SunPKCS11 p = new sun.security.pkcs11.SunPKCS11(is); <--

Ao que tudo indica, a classe SunPKCS11 possui algum tipo de limitador de recursos. Resolvi o problema implementando um recurso simples de Singleton, ou seja, possuo apenas uma instância da classe que assina as NFes e esta por sua vez possui uma única instância da classe SunPKCS11.
Após esta modificação cheguei a assinar mais de 300 notas sem qualquer problema.

Está ai a dica para quem estiver passando por problemas semelhantes.

Marcelo Daniel


"Nenhum homem deve temer a sua mulher. Apenas aqueles que a respeitam"
Sifu Ip man