打印机文件并发访问

时间:2013-07-20 07:51:34

标签: java ubuntu printing io

我正在开发系统,经常打印报告,并且始终检查打印机的状态(纸上低,缺纸等...)。我已经实现了类,查询打印机文件(/ dev / usb / lp0)的状态,如打印机(Swecoin TTP2030)手册中所写,这里是代码:

 public class PrinterStatusEnquier {
    private static Logger logger = Logger.getLogger(PrinterStatusEnquier.class);

    private static byte[] PAPER_NEAR_END_ENQUIRY = {0x1B, 0x05, 0x02}; 
    private static byte[] STATUS_ENQUIRY = {0x1B, 0x05, 0x01}; 

    private static String PRINTER_DEVICE = 
               PropertiesManager.getInstance().getApplicationProperty("printer.device.file");

    public static PaperStatus enquiryPaperStatus() throws IOException {
        logger.debug("In method enquiryPaperStatus()...");

        RandomAccessFile device = null;
        try
        {
            device = new RandomAccessFile(PRINTER_DEVICE, "rw");

            device.write(PAPER_NEAR_END_ENQUIRY);
            int response = device.readByte();

            return PaperStatus.getStatus(response);
        } catch (IOException e) {
            logger.error("Error while opening file: " + e.getMessage());
            e.printStackTrace();
            throw e;
        } finally {
            if (device != null) {
                logger.debug("Closing file...");
                device.close();
            }
        }
    }

    public static PrinterStatus enquiryPrinterStatus() throws IOException {
        logger.debug("In method enquiryPrinterStatus()...");

        RandomAccessFile device = null;
        try {
            device = new RandomAccessFile(PRINTER_DEVICE, "rw");

            device.write(STATUS_ENQUIRY);

            byte[] response = new byte[2];
            device.read(response);

            return PrinterStatus.getStatus(response);
        } catch (IOException e) {
            logger.error("Error while opening file: " + e.getMessage());
            e.printStackTrace();
            throw e;
        } finally {
            if (device != null) {
                logger.debug("Closing file...");
                device.close();
            }
        }       
    }

在我的系统中,这段代码效果很好。但是当我将它集成到系统中时,它开始引发大量的IOExceptions。我注意到它发生在打印机打印的东西时,在这一刻我试图获得状态。有时我得到异常(找不到文件),在这种情况下我可以像那样检查打印机文件 - file.canWrite()但有时我可以得到异常(设备或资源忙)或(输入/输出错误),并且这种情况file.canWrite()无济于事。最糟糕的是,打印机状态查询器不仅会抛出异常,还可以锁定打印机的文件一段时间。它仍然打印,但不适用于询问者。

是否存在在打印时查询打印机文件的方法?或者可能存在如何检查打印机文件是否可用的方法。请帮忙!

P.S。:系统是Ubuntu 12.10

更新:我正在通过DocPrintJob对象进行打印:job.print();我还尝试打印调用shell命令:

Process p;
p = Runtime.getRuntime().exec("cat output.pdf | lpr");
p.waitFor();

但我面临同样的问题。

0 个答案:

没有答案