【问题标题】:jpos : how to handle messages with different headers with different length listening to the same endpoint and using different packagerjpos:如何处理具有不同标头和不同长度的消息,侦听同一端点并使用不同的打包程序
【发布时间】:2020-03-30 06:38:42
【问题描述】:

这不是一个重复的问题,因为上一个问题的某些功能发生了变化,这是对以下问题的扩展。创建了一个新帖子,对寻找不同解决方案的其他人也很有帮助

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

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

按照上述解决方案的建议,我创建了一个自定义通道,它工作正常。但现在的挑战是我如何为每个不同的请求类型使用不同的打包器

例子

header1 -- 使用 x 打包器

header2 -- 使用 y 打包器

如果需要,我必须创建新的打包程序吗?如何链接服务器和打包程序以及标头类型。 看起来很有挑战性,jpos 也变得很有趣。

    <property name="packager-config"  value="cfg/packager/CISebcdic.xml"="True" />


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

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

请帮忙,

提前致谢, 下面完全丢失的是我正在尝试的那个,问题出在

受保护的 ISOPackager getDynamicPackager(byte[] header, byte[] 留言)

我收到如下错误

<log realm="gwmip-server-5281.server.session/10.157.152.95:26215" at="2020-04-18T00:52:22.018">
  <session-error>
    <exception name="unexpected exception">
    java.io.IOException: unexpected exception
        at org.jpos.iso.BaseChannel.receive(BaseChannel.java:787)
        at org.jpos.iso.ISOServer$Session.run(ISOServer.java:344)
        at org.jpos.util.ThreadPool$PooledThread.run(ThreadPool.java:76)
Caused by: java.lang.NullPointerException
        at java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:70)
        at java.nio.ByteBuffer.wrap(ByteBuffer.java:373)
        at org.jpos.iso.channel.GWMipChannel.getDynamicPackager(GWMipChannel.java:73)
        at org.jpos.iso.BaseChannel.receive(BaseChannel.java:743)
        ... 2 more

更新自定义频道

    package org.jpos.iso.channel;

    import org.jpos.core.Configuration;
    import org.jpos.core.ConfigurationException;
    import org.jpos.iso.ISOException;
    import org.jpos.iso.ISOMsg;
    import org.jpos.iso.ISOPackager;
    import org.jpos.iso.packager.GenericPackager;
    import org.jpos.iso.packager.MadaPackager;

    import java.io.IOException;
    import java.nio.ByteBuffer;
    import java.util.Arrays;

    public class GWMipChannel extends NACChannel {


        byte[] madaHeader = {(byte) 0x00, (byte) 0x18, (byte) 0xd6, (byte) 0xf3, (byte) 0xf6, (byte) 0xf8, (byte) 0xf7};
        byte[] nitmxHeader = {(byte) 0x00, (byte) 0x18, (byte) 0xd6, (byte) 0xf3, (byte) 0xf7, (byte) 0xf3, (byte) 0xf2};
        byte[] response_mada_header = {(byte) 0x00, (byte) 0x31, (byte) 0xc9, (byte) 0xf3, (byte) 0xf6, (byte) 0xf8, (byte) 0xf7};



        @Override
        protected byte[] readHeader(int hLen) throws IOException {

            byte[] header = new byte[25];
            serverIn.readFully(header, 0, 25);


             boolean mada_header = ByteBuffer.wrap(header, 0, 7).equals(ByteBuffer.wrap(madaHeader));
             boolean nitmx_header = ByteBuffer.wrap(header, 0, 7).equals(ByteBuffer.wrap(nitmxHeader));
             boolean rsp_mada_header = ByteBuffer.wrap(header, 0, 7).equals(ByteBuffer.wrap(response_mada_header, 0, 7));
            ISOPackager packager;
            if (mada_header) {

                return header;
            } else if (nitmx_header) {

                header = Arrays.copyOf(header,47 );

                serverIn.readFully(header, 25, 22);

                return header;
            } else if (rsp_mada_header) {

                //serverIn.readFully(header, 0, 50);

                header = Arrays.copyOf(header, 48);

                serverIn.readFully(header, 0, 48);

                return header;

            }

            return header;
        }
    @Override
        protected void 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);


        }

       @Override
        protected ISOPackager getDynamicPackager(byte[] header, byte[] message) {

            boolean mada_header = ByteBuffer.wrap(header, 0, 7).equals(ByteBuffer.wrap(madaHeader,0,7));
            boolean nitmx_header = ByteBuffer.wrap(header, 0, 7).equals(ByteBuffer.wrap(nitmxHeader,0,7));
            ISOPackager packager = null;

            if(mada_header) {

             try {
                    packager = new GenericPackager("cfg/packager/CISebcidic_mada.xml");
                } catch (ISOException e) {
                    e.printStackTrace();
                }

            }
             else if (nitmx_header) {
                try {
                     packager = new GenericPackager("cfg/packager/AS2805_NITMX.xml");

                } catch (ISOException e) {
                    e.printStackTrace();
                }
            } else {

                Exception e = new ISOException();
                e.printStackTrace();
                //return some default or throw some runtime exception exception
            }

            return packager;
        }
    }

服务器配置文件是

    <server class="org.jpos.q2.iso.QServer" logger="Q2" name="gwmip-server-5281" realm="gwmip-server-5281">
        <attr name="port" type="java.lang.Integer">5281</attr>
        <channel class="org.jpos.iso.channel.GWMipChannel"
                 packager="org.jpos.iso.packager.GenericPackager"
                 type="server"
                 logger="Q2"
                 header="0018D6F3F7F3F2000000000000000000000000000000000002"
        >
            <property name="packager-config"  value="cfg/packager/AS2805_NITMX.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="gwmip-AUTORESPONDER" />
        </request-listener>
    </server>

【问题讨论】:

    标签: jpos


    【解决方案1】:

    在您的频道自定义频道实现中,您可以覆盖getDynamicPackager(byte[] header, byte[] message)

    
    //instantiate each as required in constructor for instance or you can make them configurable through setConfiguration
    protected ISOPackager packager22, packager44;
    protected byte[] len22HeaderPrefix, len44HeaderPrefix;
    protected int headerPrefixLen = 4; //4 according to your other question
    
    protected getDynamicPackager(byte[] header, byte[] message) {
    
            if (Arrays.equals(header, len22HeaderPrefix, 0, prefixLen)) {
                return packager22;
            } else if (Arrays.equals(header, len44HeaderPrefix, 0, headerPrefixLen)) {
                return packager44;
            } else {
                //return some default or throw some runtime exception exception 
            }
    
    }
    

    【讨论】:

    • 我完全迷失了,在我的问题中,我已经发布了自定义频道实现。你能帮助得到正确的解决方案吗?谢谢
    • @AbrarSheik 似乎您的 readHeader 正在返回 null,这就是您在 getDinamicPackakger 中获取 NPE 的原因
    • 我看不出您的 readHeader 如何返回 null 您可能需要调试为什么会出现该异常
    • 如果 readheader 返回 null,那么在我实施 getDynamicpackager 之前如何正确设置消息的标头
    • 就像我在上一条评论中所说的,您需要调试 NPE 的原因
    猜你喜欢
    • 2020-07-08
    • 2015-05-26
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 2010-12-24
    • 2017-11-13
    • 2012-07-27
    • 1970-01-01
    相关资源
    最近更新 更多