Java printing & multithread
I wrote a little snippet called by php to print .postscripts files on a pre-defined network printer.
While i print one file only, everything goes well, but when i try to set up a multi-thread printing management to send more then 1 file at once to the printer, only the first one comes out.
The problem is that the PrintJobEvent PrintJobEvent.JOB_COMPLETE and PrintJobEvent.JOB_FAILED never happens, and the only events sent back by the spooler are DATA_TRANSFER_COMPLETE and NO_MORE_EVENTS .
I searched around the web and Sun forums, but no wayto find an answer. Thank you previously for any help :)
last minute editing : if i run the app in debug mo开发者_Python百科de from netbeans, and i interrupt the first thread manually, the second file is sent to the printer... so i imagine that it has to works someway
It really does not make sense to send multiple files in parallel to a printer. Why don't you create a queue and send the jobs to a Thread that would sequentially read the data from the queue and then send the results to the printer. If not you will need to serialize the output.
You might also run into issues with initializing the printer on multiple threads.
A Printer can only print one job at a time anyways.
Sorry for delay in answering, but here i am :)
So after some modifications, i've tried to build a Queue like you said, managed by a Thread waiting for the previous file to be printer, but the problem is that the printer NEVER send me back that the job is finiched / failed / cancelled.
I've searched all around the web and no way to find an answer to this problem.
I also tried to switch printer (never knows...) and the result is the same, the only events sent back are DATA_TRANSFER_COMPLETE and NO_MORE_EVENTS...
Thanks previously.
btw, here the code i am actually running :
PrintService
package print;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
public class MyPrintService extends Thread {
String name;
public MyPrintService(String name)
{
super(name);
this.name = name;
System.out.println("MyPrintService("+this.name+")");
this.start();
}
public void print()
{
System.out.println("print()");
try {
for (int i = 1; i < 3; i++) {
// Open the image file
InputStream is = new BufferedInputStream(new FileInputStream("D://giulio.provasi//Desktop//"+i+".txt"));
PrintService service = PrintServiceLookup.lookupDefaultPrintService();
// Create the print job
DocPrintJob job = service.createPrintJob();
Doc doc = new SimpleDoc(is, DocFlavor.INPUT_STREAM.AUTOSENSE, null);
// Monitor print job events
PrintJobWatcher pjDone = new PrintJobWatcher();
job.addPrintJobListener(pjDone);
// Print it
job.print(doc, null);
// Wait for the print job to be done
pjDone.waitForDone();
while(i < 10000000) {
System.out.println("le thread n'a pas attendu !");
i++;
}
// It is now safe to close the input stream
is.close();
}
} catch (Exception e) {
}
}
@Override
public void run()
{
System.out.println("run( "+this.name+" )");
this.print();
}
}
Print Listener
package print;
import javax.print.event.PrintJobEvent;
import javax.print.event.PrintJobListener;
public class PrintJobWatcher implements PrintJobListener {
Boolean done = false;
Integer status = 0;
PrintJobWatcher()
{
System.out.println("PrintJobWatcher()");
}
@Override
public void printDataTransferCompleted(PrintJobEvent pje)
{
this.done(PrintJobEvent.DATA_TRANSFER_COMPLETE);
System.out.println("DATA_TRANSFER_COMPLETE");
}
@Override
public void printJobCompleted(PrintJobEvent pje)
{
this.done(PrintJobEvent.JOB_COMPLETE);
System.out.println("JOB_COMPLETE");
}
@Override
public void printJobFailed(PrintJobEvent pje)
{
this.done(PrintJobEvent.JOB_FAILED);
System.out.println("JOB_FAILED");
}
@Override
public void printJobCanceled(PrintJobEvent pje)
{
this.done(PrintJobEvent.JOB_CANCELED);
System.out.println("JOB_CANCELED");
}
@Override
public void printJobNoMoreEvents(PrintJobEvent pje)
{
this.done(PrintJobEvent.NO_MORE_EVENTS);
System.out.println("NO_MORE_EVENTS");
}
@Override
public void printJobRequiresAttention(PrintJobEvent pje)
{
this.done(PrintJobEvent.REQUIRES_ATTENTION);
System.out.println("REQUIRES_ATTENTION");
}
private synchronized void done(Integer status)
{
System.out.println("DONE !");
this.status = status;
this.done = true;
notifyAll();
}
synchronized void waitForDone()
throws InterruptedException
{
System.out.println("AVANT : IMPRESSION EN COURS...");
try {
while (!this.done || ((this.status != PrintJobEvent.JOB_COMPLETE) || (this.status != PrintJobEvent.JOB_FAILED))) {
System.out.println("IMPRESSION EN COURS...");
wait();
}
} catch (InterruptedException e) {}
}
}
Launcher
import print.MyPrintService;
public class Main {
public static void main(String[] args)
{
System.out.println("C'est parti !");
MyPrintService test1 = new MyPrintService("1");
}
}
精彩评论