Prestazioni di stampa lente con CIFS

Problema

La configurazione di sendToPrinter per l'utilizzo di CIFS come protocollo stampante a volte causa prestazioni di stampa lente e la richiesta può anche scadere:

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

Soluzione

Per indagare il problema, il primo passo è quello di abilitare la registrazione a livello di traccia su JCIFS:

  • Aumenta il Livello di log su JCIFS aggiungendo l'argomento JVM "-Djcifs.util.loglevel=10".
  • Attiva il livello di log TRACCIA sul componente "com.adobe.printSubmitter.output.CIFSPrintJob".

Questo ci permette di ottenere una Traccia Stack più dettagliata che mostra esattamente quale operazione sta scadendo:

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)

Come per la Traccia Stack, la risoluzione DFS sta scadendo: questa query viene utilizzata per verificare se la stampante esiste effettivamente su qualche altro server. In questo caso, la richiesta viene inoltrata all'altro server. Il tempo scaduto indica un problema con il Domain Controller che non risponde o risponde troppo lentamente. Passare l'argomento JVM "-Djcifs.smb.client.dfs.disabled=true" risolve il problema di cui sopra.

Nel caso in cui la situazione non sia correlata alla risoluzione del DFS, un'analisi approfondita delle Tracce Stack dal log dettagliato dovrebbe indicare quali proprietà del JCIFS sono adeguate per risolvere il problema. 

Per tutte le proprietà disponibili su JCIFS, fai riferimento a questo link.