【问题标题】:Connection time out in jpos clientjpos客户端中的连接超时
【发布时间】:2018-12-19 03:48:57
【问题描述】:

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

【问题讨论】:

    标签: jpos


    【解决方案1】:

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

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

    如果在 timeout 指定的时间内没有任何事情发生,这种方式通道将自动断开连接,并且您对接收的调用将引发异常。

    另一种方法是使用 Q2 和多路复用器(请参阅 QMUX,您需要为此运行 Q2,或不推荐使用的 ISOMUX)。

    【讨论】:

    • 我使用 Q2 进行路由并作为服务器作为独立服务器使用,但我没有将 Q2 仅用作客户端。但是在现有代码中,我无法在 ISOChannel 接口中找到 setTimeout 方法。请建议我是否可以进行任何调整以实现相同的功能。我正在使用 jpos-1.9.2.jar
    • 您需要以 PostChannel 的身份访问该频道才能执行此操作。所以我建议将频道声明为 PostChannel 或 BaseChannel。
    • 有一个类似的问题,但是我正在使用 AsciiChannel。运行独立的 jpos 示例它工作正常,但与 Spring boot 结合仍然得到“读取超时”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 2013-02-09
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多