jpos :如何处理具有不同 headers 且长度不同的消息侦听相同的端点并使用相同的包装器

jpos : how to handle messages with different headers with different length listening to the same endpoint and using same packager

场景是第三方应用程序将消息发送到 jpos。可能是它会发送两种不同消息 header 长度的消息,比如一种长度为 22 字节,另一种长度为 44 bytes.the 包装器将相同。

我如何处理消息并将其路由到基于 header 类型的发布者? header 中的前 4 个字节将为我提供 header 长度的线索。

例如

f3f8f6f7 -- means header length is 22 bytes

f4f5f6f7 -- means header length is 44 bytes

sample : header="3867000000000000000002" or "45670000000000000000021601" upto 44

我不知道从哪里开始。我知道我可以创建两个通道,但问题是我必须从一个端点端口监听

如果我想创建自定义频道,处理这种情况的最佳方法是什么?只是想是否可以像下面这样处理,在通道 header 属性 我可以指定多个 headers?

<server class="org.jpos.q2.iso.QServer" logger="Q2" name="gwmip-server-7003" realm="bnet-server-8000">
    <attr name="port" type="java.lang.Integer">7003</attr>
    <channel class="org.jpos.iso.channel.NACChannel"
             packager="org.jpos.iso.packager.GenericPackager"
             type="server"
             logger="Q2"
             header="3687000000000000000002" or "3687000000000000000002"
             >
     <property name="packager-config"  value="cfg/packager/CISebcdic.xml" debug="True" />
        <property name="timeout" value="180000"/>
    </channel>
    <request-listener class="org.jpos.iso.IncomingListener" logger="Q2" realm="incoming-request-listener">
        <property name="queue"  value="GWMIPTXNMGR" />
        <property name="ctx.DESTINATION"  value="jPOS-AUTORESPONDER" />
    </request-listener>
</server>

我不知道该如何处理。

首先,如果你能避免,请做到这一点。您真的需要为同一个应用程序发送两个不同的 header 长度吗?

如您所说,这是第三方应用程序,我假设答案是肯定的。

其次,应用程序能否将 22 header 长度的消息发送到不同于 44 header 长度消息的端口?

如果是,最简单的方法是让两台服务器分别配置不同的 header。此解决方案不需要编码。

另一个选项将涉及编码以编写您自己的频道,其描述如下。

您只需要创建自己的 Channel 实现。

例如,您可以扩展 NACCHannel 并覆盖 sendMessageHeaderreadHeader 方法:

public class CustomChannel extends NACChannel {
    byte [] len22Header = {(byte)0xf3,(byte)0xf8,(byte)0xf6,(byte)0xf7};
    byte [] len44Header = {(byte)0xf4,(byte)0xf5,(byte)0xf6,(byte)0xf7};

    protected byte[] readHeader(int hLen) throws IOException {
        byte[] header = new byte[22];
        serverIn.readFully(header, 0, 22);
        if (Arrays.equals(header, len22Header, 0, 4)) {
            return header;
        }
        header = Arrays.copyOf(header, 44);
        serverIn.readFully(header, 22, 22);
    }

    protected sendMessageHeader(ISOMsg m, int len) throws IOException{
        byte[] header = m.getHeader();
        //assume header is the one to send, and already has 22 or 44 length
        //or you can check
        serverOut.write(header);
    }
}

那么您只需在服务器中使用您的频道 xml 而不是 NACChannel

<server class="org.jpos.q2.iso.QServer" logger="Q2" name="gwmip-server-7003" realm="bnet-server-8000">
    <attr name="port" type="java.lang.Integer">7003</attr>
    <channel class="your.package.CustomChannel"
             packager="org.jpos.iso.packager.GenericPackager"
             type="server"
             logger="Q2"
             >
     <property name="packager-config"  value="cfg/packager/CISebcdic.xml" debug="True" />
        <property name="timeout" value="180000"/>
    </channel>
    <request-listener class="org.jpos.iso.IncomingListener" logger="Q2" realm="incoming-request-listener">
        <property name="queue"  value="GWMIPTXNMGR" />
        <property name="ctx.DESTINATION"  value="jPOS-AUTORESPONDER" />
    </request-listener>
</server>