Тайм-аут подключения в клиенте jpos

Я использую клиент jpos (в одном из классов java Spring MVC Program) для подключения к серверу на основе ISO8585, однако по какой-то причине сервер не может ответить, из-за чего моя программа продолжает ждать ответа и приводит к висит моя программа. Итак, как правильно реализовать тайм-аут соединения? Моя клиентская программа выглядит так:

public FieldsModal sendFundTransfer(FieldsModal field){
        try {
            JposLogger logger = new JposLogger(ISO_LOG_LOCATION);
            org.jpos.iso.ISOPackager customPackager = new GenericPackager(ISO_PACKAGER);
            ISOChannel channel = new PostChannel(ISO_SERVER_IP, Integer.parseInt(ISO_SERVER_PORT), customPackager);// live
            logger.jposlogconfig(channel);
            channel.connect();

            log4j.info("Connection established using PostChannel");

            ISOMsg m = new ISOMsg();
            m.set(0, field.getMti());
            //m.set(2, field.getField2());
            m.set(3, field.getField3());
            m.set(4, field.getField4());
            m.set(11, field.getField11());
            m.set(12, field.getField12());
            m.set(17, field.getField17());
            m.set(24, field.getField24());
            m.set(32, field.getField32());
            m.set(34, field.getField34());
            m.set(41, field.getField41());
            m.set(43, field.getField43());
            m.set(46, field.getField46());
            m.set(49, field.getField49());
            m.set(102,field.getField102());
            m.set(103,field.getField103());
            m.set(123, field.getField123());
            m.set(125, field.getField125());
            m.set(126, field.getField126());
            m.set(127, field.getField127());

            m.setPackager(customPackager);
            System.out.println(ISOUtil.hexdump(m.pack()));
            channel.send(m);
            log4j.info("Message has been send");

            ISOMsg r = channel.receive();
            r.setPackager(customPackager);
            System.out.println(ISOUtil.hexdump(r.pack()));

            channel.disconnect();

        }catch (Exception err) {
            System.out.println("sendFundTransfer : " + err);

        }
        return field;
    }

person Diwas Sapkota    schedule 11.07.2018    source источник


Ответы (1)


Что ж, настоящий правильный способ - использовать Q2. Если вам не нужно постоянное соединение, вы можете просто установить тайм-аут для канала.

PostChannel channel = new PostChannel(ISO_SERVER_IP, Integer.parseInt(ISO_SERVER_PORT), customPackager);// live
channel.setTimeout(timeout); //timeout in millies. 

Таким образом, канал будет автоматически отключаться, если в течение времени, заданного таймаутом, ничего не произойдет, и ваш вызов для приема вызовет исключение.

Альтернативой является использование Q2 и мультиплексора (см. QMUX, для которого необходимо запустить Q2 или ISOMUX, который вроде как устарел).

person Andrés Alcarraz    schedule 11.07.2018
comment
Я использовал Q2 для маршрутизации и как сервер в качестве автономного сервера, однако я не использовал Q2 только как клиент. Однако в существующем коде я не могу найти метод setTimeout в интерфейсе ISOChannel. Пожалуйста, посоветуйте, могу ли я сделать какие-нибудь настройки, чтобы реализовать то же самое. Я использую jpos-1.9.2.jar - person Diwas Sapkota; 11.07.2018
comment
Для этого вам нужно получить доступ к каналу как PostChannel. поэтому я предлагаю объявить канал как PostChannel или BaseChannel. - person Andrés Alcarraz; 11.07.2018
comment
Была аналогичная проблема, однако я использую AsciiChannel. Запустив автономные образцы jpos, он работает нормально, но в сочетании с загрузкой Spring все еще имеет 'время ожидания чтения' - person Dun0523; 02.10.2019