jpos 客户端连接超时

Connection time out in jpos client

我正在使用 jpos 客户端(在 java Spring MVC 程序的 class 之一中)连接基于 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;
    }

嗯,真正正确的方法 是使用 Q2。鉴于您不需要持久连接,您可以为通道设置超时。

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

如果在 timeout 指定的时间内没有任何反应,这样频道将自动断开连接,并且您对 receive 的调用将抛出异常。

备选方案是使用 Q2 和多路复用器(请参阅 QMUX, for which you need to run Q2, or ISOMUX,这是不推荐使用的)。