【问题标题】:JPOS NACChannel Unable to Parse Incoming Message with HeaderJPOS NACChannel 无法解析带有标头的传入消息
【发布时间】:2018-10-26 14:57:19
【问题描述】:

我正在使用 JPOS v2.1.0 的 NACChannel。我正在使用 GenericPackager 来打包我的消息。我能够成功地向我的 ISO 应用程序发送消息。但是在接收传入消息时,我的 NACChannel.receive() 会引发解析错误。

我的传入消息有一个自定义标题。我怀疑这是导致解析错误的原因。所以我的问题是:

  1. 如何处理传入响应中的这个 ISOMsg 标头?
  2. 有什么方法可以禁用解析步骤并从通道接收字节[]响应?

我正在使用的 JPOS 客户端代码:

public class BuildISOMessage {

public static void main(String[] args) throws IOException, ISOException {
    createISOMessage();

}

public static byte[] createISOMessage() throws ISOException {
    String HOST = "localhost";
    int PORT = 40021;

    // Create Packager based on XML that contain DE type
    ISOBasePackager packager = new GenericPackager("800_fields.xml");

    NACChannel testchannel = new NACChannel();

    testchannel.setHost(HOST, PORT);

    ISOMsg isoMsg = build200ISOMessage(packager);

    // print the DE list
    logISOMsg(isoMsg);

    // Get and print the output result
    byte[] data = isoMsg.pack();

    try {           
        testchannel.setPackager(isoMsg.getPackager());
        testchannel.setHeader(("ISO01" + String.format("%04d", data.length)).getBytes());

        testchannel.connect();          
        testchannel.send(isoMsg);

        if (testchannel.isConnected()) {
            ISOMsg response = testchannel.receive();
        }
        testchannel.disconnect();

    } catch (Exception e) {
        e.printStackTrace();
    }
    return data;
}

private static ISOMsg build200ISOMessage(ISOBasePackager packager)
        throws ISOException {
    // Create ISO Message
    ISOMsg isoMsg = new ISOMsg();
    isoMsg.setPackager(packager);
    isoMsg.setMTI("200");       
    isoMsg.set(2, "4622871000060891");
    isoMsg.set(3, "300000");
    isoMsg.set(4, "100");       
    isoMsg.set(7, "1026043633");
    isoMsg.set(11, "999901");       
    isoMsg.set(12, "113633");
    isoMsg.set(13, "1026");
    isoMsg.set(15, "1116");
    isoMsg.set(16, "1116");     
    isoMsg.set(18, "6011");
    isoMsg.set(22, "21");       
    isoMsg.set(32, "0000004");
    isoMsg.set(33, "0000004");
    isoMsg.set(35, "4622871000060891=22082211963393100000");
    isoMsg.set(37, "829911364035");
    isoMsg.set(43, "TBNKTAS2B065B999P999300501000050      TH");
    isoMsg.set(48, "00000000040000000002000000013000000000005000000000007000TYRIONLANNISER ARYA STARK000000003334000000000202        00000000000000000000");
    isoMsg.set(49, "764");      
    isoMsg.set(52, "FFFFFFFFFFFFFFFF");
    isoMsg.set(62, "221000000000");

    return isoMsg;
}

private static void logISOMsg(ISOMsg msg) {
    System.out.println("----ISO MESSAGE-----");
    try {
        System.out.println("  MTI : " + msg.getMTI());
        for (int i = 1; i <= msg.getMaxField(); i++) {
            if (msg.hasField(i)) {
                System.out.println("    Field-" + i + " : "
                        + msg.getString(i));
            }
        }
    } catch (ISOException e) {
        e.printStackTrace();
    } finally {
        System.out.println("--------------------");
    }
}
}

【问题讨论】:

  • 你的 setHeader 对 NACChannel 没有多大意义,首先,长度是由通道自动处理的,所以“String.format(”似乎是错误的。另外,header 需要压缩数字,因为 NACChannel 的 setHeader 方法将其转换为 bcd 字节数组。最后,我不明白如果你想自己解析消息,为什么要使用 jpos 通道。这种情况下,你可以建立一个 tcp 连接并直接使用打包器打包和解包。
  • 我们需要更多信息来帮助您,标题的预期格式是什么,以及应该如何传输长度,也许 NACChannel 不适合您
  • 顺便说一句,你的 logISOMsg 方法可以用一个衬里来简化:msg.dump (System.out, "");
  • 亲爱的@apr。感谢您的输入。这很有帮助。
  • 亲爱的@AndrésAlcarraz 我使用了一个单独的客户端使用 Netty。工作正常,但解析具有挑战性。所以探索JPOS渠道。为了分析,我创建了 NACChannel 的一个子类,并将一些调试放入 receive() 方法中,很高兴发现该标头实际上已正确解析。我的应用程序在请求和响应中都需要 ISO01 这个 9 字节的标头。我认为问题在于字段 32。我正在使用 org.jpos.iso.IFA_LLNUM。输入 in[ 32: ]&lt;7&gt; in[ 32: ]&lt;0000004&gt; 和输出 out[ 32: ]&lt;07&gt; out[ 32: ]&lt;0000004&gt; 中的示例字段。

标签: iso8583 jpos


【解决方案1】:

感谢大家的帮助。 在为调试目的寻找答案时,我创建了 NACChannel 的子类并放置了一些调试语句。通过这样做,我意识到问题出在我的字段定义上,与 JPOS 框架无关。

我正在通过以下代码设置长度为“9”的标头(例如 ISO010200,其中消息长度为 200)。

testchannel.setHeader(("ISO01" + String.format("%04d", data.length)).getBytes());

我的回复也有一个类似的长度为“9”的标题。 所以 NACChanel receive() 方法能够正确提取 9 位 Header。 但是解析响应消息失败,我的字段定义不正确。

修复后,JPOS 能够正确解析响应消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    相关资源
    最近更新 更多