jpos: как обрабатывать сообщения с разными заголовками разной длины, прослушивая одну и ту же конечную точку и используя другой упаковщик - PullRequest
0 голосов
/ 30 марта 2020

это не повторяющийся вопрос, так как в предыдущем вопросе некоторые функциональные возможности изменились, и это как расширение ниже. создал новый пост, который также будет полезен для других, которые ищут разные решения

jpos: как обрабатывать сообщения с разными заголовками разной длины, прослушивая одну и ту же конечную точку и используя один и тот же упаковщик

Сценарий стороннего приложения будет отправлять сообщения в jpos. возможно, что он будет отправлять два типа сообщений с разной длиной заголовка сообщения, скажем, один будет иметь длину 22 байта, а другой - 44 байта. Упаковщик будет другим.

Как указано в приведенном выше решении, я создал Пользовательский канал, и он работает нормально. Но теперь проблема в том, как мне использовать разные упаковщики для каждого типа запроса

пример

header1 - использовать x packager

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 (заголовок байта [], сообщение байта [])

Я получаю сообщение об ошибке, как показано ниже

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

1 Ответ

0 голосов
/ 01 апреля 2020

В реализации своего пользовательского канала вы можете переопределить 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 
        }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...