提问者:小点点

jpos:如何处理具有不同长度的不同标头的消息,监听相同的endpoint并使用相同的打包程序


这种情况是第三方应用程序将向jpos发送消息。可能是它将发送两种类型的消息,具有不同的消息头长度,例如一个长度为22字节,另一个长度为44字节。打包程序将是相同的。

如何根据标头类型处理这两条消息并将其路由到发行者?标头中的前4个字节将为我提供标头长度的线索。

举个例子

f3f8f6f7--表示标头长度为22字节

f4f5f6f7--表示标头长度为44字节

示例:标题="3867000000000000000002"或"45670000000000000000021601"最多44

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

如果我想创建一个自定义频道,处理这种情况的最佳方法是什么?只是在想是否可以如下处理,在频道标题属性中我可以指定多个标题?

<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>

我不知道如何处理这件事。


共1个答案

匿名用户

首先,如果你能避免这种情况,请这样做。你真的需要为同一个应用程序发送两个不同的标头长度吗?

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

其次,应用程序是否可以将22个标头长度消息发送到与44个标头长度消息不同的端口?

如果是,最简单的方法就是让两台服务器各配置一个不同的头。这个解决方案不需要编码。

另一种选择涉及编码以编写您自己的频道,如下所述。

您只需要创建自己的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>