开发者

Java printing & multithread

开发者 https://www.devze.com 2023-01-05 17:52 出处:网络
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 printin

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");
    }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消