[OpenJDK 2D-Dev] [9] Review Request: 8046007: Java app receives javax.print.PrintException: Printer is not accepting job

Alexey Ivanov alexey.ivanov at oracle.com
Wed Jul 16 13:09:58 UTC 2014


Hello,

Please review the fix for jdk9:
     bug: https://bugs.openjdk.java.net/browse/JDK-8046007
     webrev: http://cr.openjdk.java.net/~aivanov/8046007/jdk9/webrev.00/

Problem description:
If printer is an error state for some reason, Java application cannot 
post a new print job to printer queue because of exception:
java.awt.print.PrinterException: Printer is not accepting job.
         at sun.print.RasterPrinterJob.print(RasterPrinterJob.java:1326)
         at javax.swing.text.JTextComponent$2.call(JTextComponent.java:2320)
         at java.util.concurrent.FutureTask.run(FutureTask.java:262)
         at 
javax.swing.text.AbstractDocument.render(AbstractDocument.java:420)
         at javax.swing.text.JTextComponent$3.run(JTextComponent.java:2369)
         at java.lang.Thread.run(Thread.java:744)

At the same time, regular Windows applications (e.g. Word) can still add 
new print jobs to the queue of this printer.

See also related JDK-6996782: RFE: Optionally allow submitting printjobs 
even if Printer is not accepting job
and JDK-6525150: Printer has "paper out" status and won't print due to a 
PrinterException.


The fix:
Currently Java checks the status of the printer, and does not allow 
posting a new print job if the printer is in an error state. At the same 
time, the print queue functions without any issues. It is user's 
responsibility to fix a problem with the printer, as soon as it's 
resolved, all the print jobs will be processed by the printer.

Microsoft Knowledge Base article http://support.microsoft.com/kb/160129 
says:
The Printer is assumed ready to accept print jobs … even if the physical 
printer is in an error state such as off-line.

As far as I can see, the only printer state from the list 
(http://msdn.microsoft.com/en-us/library/windows/desktop/dd162845%28v=vs.85%29.aspx) 
that doesn't allow adding new print jobs is 
PRINTER_STATUS_PENDING_DELETION which means "The printer is being 
deleted." Surely one cannot print to a deleted printer.


I tested this fix by disconnecting the network printer. It takes some 
time for printer monitor to update the status before communication error 
is detected. It would not be detected at all until you add at least one 
print job. As soon as the printer driver detects the problem and 
communicates it to Windows, printer queue displays an error state on the 
currently processed print job. From that moment, Java apps cannot print 
to this printer.

With this fix, Java still considers "Accepting jobs" and thus allows 
posting new jobs to the printer queue.

When the connection to the printer is restored, all the queued jobs are 
successfully processed and documents are printed.


Regression test:
I ran regressions tests in jdk/tests/javax/print, and all tests passed.

No regression test is provided due to its complexity. Printer should go 
to an error state, it depends on the printer driver and on whether the 
printer is local or network.

There's a test app and steps to try to reproduce the issue in the JBS 
bug 8046007.


Thank you,
Alexey.



More information about the 2d-dev mailing list