JPOS NACChannel无法解析带有标题的传入消息

时间:2018-10-26 14:57:19

标签: iso8583 jpos

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

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

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

我正在使用的我的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("--------------------");
    }
}
}

1 个答案:

答案 0 :(得分:1)

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

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

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

我的回复也有类似的标头,长度为'9'。 因此,NACChanel receive()方法能够正确提取9位标题。 但是无法解析响应消息,我的字段定义不正确。

一旦修复,JPOS便能够正确解析响应消息。