shtrih-m / javapos_shtrih

Реализация JavaPOS драйвера принтера фискального регистратора для устройств Штрих-М
http://www.shtrih-m.ru
MIT License
33 stars 16 forks source link

Назначение метода claim #69

Open JIO6CTEPok opened 5 years ago

JIO6CTEPok commented 5 years ago

Здравствуйте. В приложении реализую подключение к принтеру: if (printer.getState() != JposConst.JPOS_S_CLOSED) { printer.close(); } printer.open("ShtrihFptr"); printer.claim(3000); printer.setDeviceEnabled(true); printer.setAsyncMode(false); Любое действие с принтером в приложении выполняется в очередности:

  1. Подключиться к принтеру вышеприведенным способом
  2. Совершить действие, например печать чека

Пользователи жалуются на небольшую задержку перед печатью чека. Если уменьшить таймаут метода claim (или не вызывать claim) то не удается подключиться к принтеру. Вопросы

  1. Стоит ли мне сохранять объект ShtrihPrinterManager после соединения и использовать его повторно?
    1. Я правильно понимаю, что метод claim осуществляет задержку перед использованием принтера (только для того чтобы тот успел включиться)?
nyxiscoo1 commented 5 years ago

Здравствуйте. Метод claim никаких задержек не реализует. Значение передаваемое в метод насколько я помню игнорируется во всех вариантах работы драйвера. Первое подключение к принтеру может быть в 2-4 раза дольше последующих. Я не сравнивал разницы в сохранении принтера и создании каждый раз нового, в примере я сохраняю объект принтера.

Neznakomec commented 4 years ago

nyxiscoo1, на метод claim приходится основное время задержки в открытии BlueTooth соединения с принтером 2019-09-20-17:33:24.241 [pool-7-thread-1] DEBUG c.s.j.f.FiscalPrinterService - claim(10000) 2019-09-20-17:33:31.233 [pool-7-thread-1] DEBUG c.s.j.f.FiscalPrinterService - claim: OK

Neznakomec commented 4 years ago

По сравнению со стандартным подходом в примере:

        if (printer.getState() != JposConst.JPOS_S_CLOSED) {
            printer.close();
        }

        printer.open("ShtrihFptr");
        printer.claim(3000);
        printer.setDeviceEnabled(true);

Мы пробуем делать без переоткрытия соединения:

                    if (printer.getState() == JposConst.JPOS_S_ERROR) {
                        printer.close();
                    }
                    if (printer.getState() != JposConst.JPOS_S_CLOSED) {
                        if (!printer.getClaimed()) {
                            printer.claim(10000);
                        }
                        printer.setDeviceEnabled(true);
                    } else {
                        printer.open("ShtrihFptr");
                        printer.claim(10000);
                        printer.setDeviceEnabled(true);
                    }

Это работает быстрее (без задержки 6-8 сек), но с надежностью не уверен. Один раз встречал зацикливания на ошибке JposException: read failed, socket might closed or timeout, read ret: -1

nyxiscoo1 commented 4 years ago

По каким-то неведомым мне причинам в claim выполняется открытие соединения, точнее выполнялось, я его убирал, потом его опять добавил мой коллега и на днях я делал комит в котором как полагается убрал код установления подключения в claim.

Можете собрать текущую версию она будет работать как я описывал.