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

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

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

Например

f3f8f6f7 - означает, что длина заголовка составляет 22 байта

f4f5f6f7 - означает, что длина заголовка составляет 44 байта

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

Понятия не имею, как с этим справиться.

1 Ответ

0 голосов
/ 27 марта 2020

Прежде всего, если вы можете избежать этого, пожалуйста, сделайте это. Вам действительно нужно отправить две разные длины заголовка для одного и того же приложения?

Поскольку вы сказали, что это стороннее приложение, я приму ответ «да».

Во-вторых, случайно, может приложение отправляет 22 сообщения с длиной заголовка в порт, отличный от 44 сообщений с длиной заголовка?

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

Другой вариант включает кодирование для записи собственного канала, и оно описывается следующим образом.

Вам просто нужно создать собственную реализацию Channel.

Например, вы можете расширить NACCHannel и переопределить sendMessageHeader и readHeader методы:

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...