jpos: возможно ли иметь разные заголовки для входящих и исходящих сообщений в одном канале - PullRequest
0 голосов
/ 15 апреля 2020

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

У меня есть ниже настраиваемый канал - намерение состоит в том, чтобы обрабатывать разные заголовки различной длины

package org.jpos.iso.channel;

import org.jpos.iso.ISOException;
import org.jpos.iso.ISOMsg;
import org.jpos.iso.ISOPackager;
import org.jpos.iso.packager.GenericPackager;

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) 0x18, (byte) 0xc9, (byte) 0xf3, (byte) 0xf6, (byte) 0xf8, (byte) 0xf7};


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

        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, 50);

            serverIn.readFully(header, 0, 50);

            return header;

        }

        return header;
    }

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


    }

}

в журнале q2 я вижу, что сообщения правильно анализируются в соответствии с заголовками

<log realm="org.jpos.transaction.TransactionManager" at="2020-04-16T18:37:55.662" lifespan="555ms">
  <commit>
    gwmip-1:idle:1
    <context>
      TIMESTAMP: Thu Apr 16 18:37:55 AEST 2020
      SOURCE: org.jpos.iso.channel.X9AChannel@102579c0
      REQUEST:
       <isomsg direction="outgoing">
         <!-- org.jpos.iso.packager.GenericPackager[cfg/packager/iso87ascii-backup.xml] -->
         <header>0018D6F3F6F8F7000000000000000000000000000000000002</header>
         <field id="0" value="0200"/>
         <field id="2" value="5000100100700010"/>
         <field id="3" value="000000"/>
         <field id="4" value="002167959991"/>
         <field id="7" value="0416083755"/>
         <field id="11" value="199682"/>
         <field id="12" value="183753"/>
         <field id="13" value="0416"/>
         <field id="14" value="1612"/>
         <field id="18" value="4900"/>
         <field id="22" value="812"/>
         <field id="32" value="588850"/>
         <field id="33" value="004601"/>
         <field id="37" value="123451234512"/>
         <field id="41" value="UTIS2I25"/>
         <field id="42" value="EUREKAAIR      "/>
         <field id="43" value="01007/S2M_txn_base.mat rix_/ Parel M XYZ"/>
         <field id="48" value="54363130353030303031393230333132333432303730313033323132343332386A48796E2B3759466931455541524541414141764E5565364876383D" type="binary"/>
         <field id="49" value="356"/>
         <field id="61" value="10251000066003560000000000"/>
         <field id="63" value="MC2J2G6P8"/>
       </isomsg>

      DESTINATION: gwmip-AUTORESPONDER
      RESULT:
       <result/>

      :paused_transaction:
       id: 1

      RESPONSE:
       <isomsg direction="outgoing">
         <!-- org.jpos.iso.packager.GenericPackager[cfg/packager/CISebcdic_mada.xml] -->
         <header>0018C9F3F6F8F700000000000000000000000000000000000000000000000000000000000000000000000000000000000002</header>
         <field id="0" value="0210"/>
         <field id="2" value="165000100100700010"/>
         <field id="3" value="000000"/>
         <field id="4" value="002167959991"/>
         <field id="7" value="0416083755"/>
         <field id="11" value="199682"/>
         <field id="15" value="0416"/>
         <field id="32" value="06588850"/>
         <field id="33" value="06004601"/>
         <field id="37" value="123451234512"/>
         <field id="38" value="183755"/>
         <field id="39" value="00"/>
         <field id="41" value="UTIS2I25"/>
         <field id="48" value="060T6105000019203123420701032124328jHyn+7YFi1EUAREAAAAvNUe6Hv8="/>
         <field id="49" value="356"/>
         <field id="63" value="009MC2J2G6P8"/>
       </isomsg>

мой сервер

<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="6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"
            >
     <property name="packager-config"  value="cfg/packager/CISebcdic_mada.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>

мой канал эмитента

<?xml version="1.0" ?>

<channel-adaptor name='gwmip-channel' class="org.jpos.q2.iso.ChannelAdaptor" logger="Q2">
    <channel class="org.jpos.iso.channel.X9AChannel"
             packager="org.jpos.iso.packager.GenericPackager"
             logger="Q2"
             header="6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"
             >

         <property name="packager-config"  value="cfg/packager/iso87ascii-backup.xml" debug="True" />

        <property name="host" value="127.0.0.1" />
        <property name="port" value="9001" />
    </channel>
   <in>gwmip-send</in>
    <out>gwmip-receive</out>
    <reconnect-delay>10000</reconnect-delay>
</channel-adaptor>

Проблема здесь в ответном сообщении 0210: jpos отправляет только вторую половину 25 байтов в качестве заголовка, а не 50 байтов, полученных от эмитента. Первые 25 байтов заголовка не отправляются.

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