【问题标题】:jpos : how to handle messages with different headers with different length listening to the same endpoint and using same packagerjpos:如何处理具有不同标头和不同长度的消息,侦听相同的端点并使用相同的打包器
【发布时间】:2020-07-08 04:09:26
【问题描述】:

场景是第三方应用程序将向 jpos 发送消息。可能是它会发送两种消息头长度不同的消息,一种是 22 字节,另一种是 44 字节。打包器是相同的。

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

例如

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

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

示例 : header="3867000000000000000002" 或 "45670000000000000000021601" 最多 44

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

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

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

我不知道如何处理。

【问题讨论】:

    标签: jpos


    【解决方案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>
    

    【讨论】:

    • Alcarraz 谢谢,它工作了,但现在要求不同了。iso 消息也可以是不同的格式。在这种情况下如何配置使用多个打包器。示例 header1 使用 x 打包器,header2 使用 -> y 打包器。
    • ---> 如何使用多个打包程序
    猜你喜欢
    • 1970-01-01
    • 2017-11-13
    • 2012-07-27
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多