Rendimiento de impresión lento con CIFS

Problema

La configuración de sendToPrinter para usar CIFS como un protocolo de impresora a veces resulta en un rendimiento de impresión lento, y la solicitud puede incluso agotarse el tiempo de espera:

[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)

Solución

Para investigar el problema, el primer paso es habilitar el registro de nivel de traza en JCIFS:

  • Aumentar el nivel de registro en la JCIFS añadiendo el argumento "-Djcifs.util.loglevel=10" JVM.
  • Active TRACE Log Level en el componente "com.adobe.printSubmitter.output.CIFSPrintJob".

Esto nos permite obtener un Stack Trace más detallado que muestra exactamente qué operación está agotando el tiempo de espera:

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 acuerdo con el Stack Trace anterior, la resolución DFS se termina: Ésta consulta se utiliza para verificar si la impresora existe realmente en algún otro servidor, en cuyo caso la solicitud se enruta a ese otro servidor. El tiempo de espera indica un problema con el controlador de dominio que no responde o es demasiado lento para responder. Pasar el argumento JVM "-Djcifs.smb.client.dfs.disabled=true" que resuelve el problema anterior.

En caso de que la situación no esté relacionada con la resolución DFS, el análisis en profundidad de Stack Traces del registro detallado debe indicar qué propiedad de JCIFS es adecuada para resolver el problema. 

Para todas las propiedades disponibles en JCIFS, por favor consulte este link.