Desempenho lento de impressão ao usar o CIFS

Problema

Configurar o sendToPrinter para usar o CIFS como um Protocolo de impressora quando a impressão está com o desempenho lento e a solicitação pode atingir o tempo limite:

[Transport1] ERROR [STDERR] - java.net.ConnectException: Connection timed out
[Transport1] ERROR [STDERR] - at java.net.PlainSocketImpl.socketConnect(Native Method)
[Transport1] ERROR [STDERR] - at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
[Transport1] ERROR [STDERR] - at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
[Transport1] ERROR [STDERR] - at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
[Transport1] ERROR [STDERR] - at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
[Transport1] ERROR [STDERR] - at java.net.Socket.connect(Socket.java:579)
[Transport1] ERROR [STDERR] - at java.net.Socket.connect(Socket.java:528)
[Transport1] ERROR [STDERR] - at java.net.Socket.(Socket.java:425)
[Transport1] ERROR [STDERR] - at java.net.Socket.(Socket.java:208)
[Transport1] ERROR [STDERR] - at jcifs.smb.SmbTransport.negotiate(SmbTransport.java:293)
[Transport1] ERROR [STDERR] - at jcifs.smb.SmbTransport.doConnect(SmbTransport.java:353)
[Transport1] ERROR [STDERR] - at jcifs.util.transport.Transport.run(Transport.java:240)
[Transport1] ERROR [STDERR] - at java.lang.Thread.run(Thread.java:745)

Solução

Para investigar o problema, a primeira etapa é habilitar o log de nível de rastreamento no JCIFS:

  • Aumente o Nível de Log no JCIFS adicionando o argumento JVM “-Djcifs.util.loglevel=10“.
  • Habilite o Nível de log TRACE no componente “com.adobe.printSubmitter.output.CIFSPrintJob”.

Isso nos permite obter um Rastreamento de Pilha mais detalhado mostrando exatamente qual operação está esgotando o tempo limite:

jcifs.util.transport.TransportException: Connection timeout
at jcifs.util.transport.Transport.connect(Transport.java:178)
at jcifs.smb.SmbTransport.connect(SmbTransport.java:338)
at jcifs.smb.SmbTree.treeConnect(SmbTree.java:144)
at jcifs.smb.SmbTree.send(SmbTree.java:66)
at jcifs.smb.SmbTransport.getDfsReferrals(SmbTransport.java:742)
at jcifs.smb.Dfs.getTrustedDomains(Dfs.java:64)
at jcifs.smb.Dfs.resolve(Dfs.java:146)

De acordo com o Rastreamento de Pilha acima, a resolução DFS está esgotando o tempo limite: esta consulta é usada para verificar se a impressora realmente existe em algum outro servidor e neste caso a solicitação é roteada para outro servidor. O esgotamento do tempo limite indica um problema com o Controlador de Domínio que não responde, ou responde muito lentamente. Passar o argumento JVM "-Djcifs.smb.client.dfs.disabled=true" resolve o problema acima.

Caso a situação não esteja relacionada à resolução DFS, a análise aprofundada do log detalhado do Rastreamento de Pilha deve indicar qual propriedade JCIFS é adequada para resolver o problema. 

Para todas as propriedades disponíveis no JCIFS, consulte este link.