Проблема с отправкой iso-сообщения с использованием ChannelAdaptor и QMUX

Я использую адаптер канала и qmux для отправки сообщения iso8583 на сервер сокетов.

Я пишу 2 клиента и сервера Jpos проекта maven в netbeans.

Сервер принимает соединение, но не получает сообщение (или клиент не отправляет сообщение), но когда я отменяю процесс клиентского проекта, сервер получает

Пожалуйста, поправьте меня, если я ошибаюсь.

Ниже приведены мои файлы конфигурации (см. http://jpos.org/doc/proguide-draft. pdf)

10_channel.xml

<?xml version="1.0" encoding="UTF-8"?>
<channel-adaptor name='test-channel' 
                 class="org.jpos.q2.iso.ChannelAdaptor" logger="Q2">
    <channel class="org.jpos.iso.channel.ASCIIChannel" logger="Q2" realm="test-channel"
                 packager="org.jpos.iso.packager.GenericPackager">       
        <property name="packager-config" value="src/main/resources/iso8583.xml" />
        <property name="host" value="127.0.0.1" />
        <property name="port" value="9090" />
        <property name="connection-timeout" value="15000" /> 
        <property name="timeout" value="3000000" />
        <property name="keep-alive" value="true" />  
    </channel>
<!--    <ignore-iso-exceptions>yes</ignore-iso-exceptions>-->
    <in>client-send</in>
    <out>client-receive</out>
    <reconnect-delay>10000</reconnect-delay>
</channel-adaptor>

20_mux.xml

<?xml version="1.0" encoding="UTF-8"?>
<mux class="org.jpos.q2.iso.QMUX" logger="Q2" name="test-mux">
    <in>client-receive</in>
    <out>client-send</out>
    <ready>test-channel.ready</ready>
    <unhandled>myunhandledqueue</unhandled>
    <key>2 7</key> 
</mux>

Код клиента JPos

Q2 q2 = new Q2("src/main/deploy/");
q2.start();
QMUX mux = (QMUX)NameRegistrar.getIfExists("mux.test-mux");
if (mux != null && mux.isConnected()) {
            ISOMsg request = new IsoMessage().build();    //dump iso message
            ISOMsg response = mux.request(request, REQUEST_TIMEOUT);
            if (response != null) {
                ISOMsg receivedIsoMsg = new ISOMsg();
                receivedIsoMsg.setPackager(new GenericPackager("path_to_file_xml"));
                receivedIsoMsg.unpack(response.getBytes());
                receivedIsoMsg.dump(System.out, "");
            }
  }

Код сокет-сервера

ServerSocket serverSocket;
try {
            System.out.println("Binding to port " + SERVER_PORT + ", please wait  ...");
            serverSocket = new ServerSocket(SERVER_PORT);
            System.out.println("Server started: " + serverSocket);
            System.out.println("Waiting for a client ...");
            while (true) {
                try {
                    Socket socket = serverSocket.accept();
                    DataInputStream dis = new DataInputStream(socket.getInputStream());
                    String message = (String) dis.readLine();
                    System.out.println("Message Received: " + message);                   
                    ISOMsg receivedIsoMsg = new ISOMsg();
                    receivedIsoMsg.setPackager(new GenericPackager("path_to_file_xml"));
                    receivedIsoMsg.unpack(message.getBytes());
                    receivedIsoMsg.setMTI("0110");
                    receivedIsoMsg.set(39,"00");
                    receivedIsoMsg.dump(System.out, "");
                    DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
                    //write object to Socket
                    dos.writeUTF(new String(receivedIsoMsg.pack()));

                } catch (IOException | ISOException ex) {
                    System.err.println(ex);
                }
            }
        } catch (IOException e1) {
            try {
                serverSocket.close();
            } catch (IOException ex) {
                 System.err.println(ex);
            }
        } 

Клиент журнала трассировки:

--- exec-maven-plugin:1.2.1:exec (default-cli) @ JposTest ---
<log realm="Q2.system" at="2020-07-30T10:45:25.638">
  <info>
    Q2 started, deployDir=/Users/lap/NetBeansProjects/JposTest/src/main/deploy, environment=default
  </info>
</log>
<log realm="Q2.system" at="2020-07-30T10:45:26.160" lifespan="507ms">
  <version>
    jPOS 2.1.3 master/95b8dce (2019-06-16 15:16:57 ART) 

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

jPOS Community Edition, licensed under GNU AGPL v3.0.
This software is probably not suitable for commercial use.
Please see http://jpos.org/license for details.

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Darwin)

iQEcBAEBAgAGBQJMolHDAAoJEOQyeO71nYtFv74H/3OgehDGEy1VXp2U3/GcAobg
HH2eZjPUz53r38ARPiU3pzm9LwDa3WZgJJaa/b9VrJwKvbPwe9+0kY3gScDE1skT
ladHt+KHHmGQArEutkzHlpZa73RbroFEIa1qmN6MaDEHGoxZqDh0Sv2cpvOaVYGO
St8ZaddLBPC17bSjAPWo9sWbvL7FgPFOHhnPmbeux8SLtnfWxXWsgo5hLBanKmO1
1z+I/w/6DL6ZYZU6bAJUk+eyVVImJqw0x3IEElI07Nh9MC6BA4iJ77ejobj8HI2r
q9ulRPEqH9NR79619lNKVUkE206dVlXo7xHmJS1QZy5v/GT66xBxyDVfTduPFXk=
=oP+v
-----END PGP SIGNATURE-----

  </version>
</log>
<log realm="Q2.system" at="2020-07-30T10:45:26.168" lifespan="5ms">
  <info>
    deploy: /Users/lap/NetBeansProjects/JposTest/src/main/deploy/10_zp_channel.xml
  </info>
</log>
<log realm="Q2.system" at="2020-07-30T10:45:26.199" lifespan="30ms">
  <info>
    deploy: /Users/lap/NetBeansProjects/JposTest/src/main/deploy/20_zp_qmux.xml
  </info>
</log>
<log realm="Q2.system" at="2020-07-30T10:45:26.207" lifespan="8ms">
  <info>
    deploy: /Users/lap/NetBeansProjects/JposTest/src/main/deploy/99_sysmon.xml
  </info>
</log>
<log realm="org.jpos.q2.qbean.SystemMonitor" at="2020-07-30T10:45:26.225">
  <info>
    Starting SystemMonitor
  </info>
</log>
<log realm="org.jpos.q2.qbean.SystemMonitor" at="2020-07-30T10:45:26.225">
  <info>
               ......
     thread count: 10
     peak threads: 10
     user threads: 7
            Thread[Reference Handler,10,system]
            Thread[Finalizer,8,system]
            Thread[Signal Dispatcher,9,system]
            Thread[main,5,main]
            Thread[pool-1-thread-1,5,main]
            Thread[Q2-dd666708-34a1-46dc-9a10-4df253d9249a,5,main]
            Thread[Thread-1,5,main]
            Thread[channel-sender-client-send,5,main]
            Thread[channel-receiver-client-receive,5,main]
            Thread[SystemMonitor,5,main]
    name-registrar:
      tspace:default: org.jpos.space.TSpace
         key-count: 0
            gcinfo: 0,0
      Q2: org.jpos.q2.Q2
      test-channel: org.jpos.q2.iso.ChannelAdaptor
        tx=0, rx=0, connects=0, last=0
      logger.Q2: org.jpos.util.Logger
      channel.test-channel: org.jpos.iso.channel.ASCIIChannel
      mux.test-mux: org.jpos.q2.iso.QMUX
        tx=0, rx=0, tx_expired=0, tx_pending=0, rx_expired=0, rx_pending=0, rx_unhandled=0, rx_forwarded=0, connected=false, last=0
      logger.: org.jpos.util.Logger
  </info>
</log>
<log realm="test-channel/127.0.0.1:9090" at="2020-07-30T10:45:36.309" lifespan="10084ms">
  <connect>
    Try 0 127.0.0.1:9090
  </connect>
</log>

<log realm="test-channel/127.0.0.1:9090" at="2020-07-30T10:45:55.579" lifespan="1ms">
  <send>
    <isomsg direction="outgoing">
      <!-- org.jpos.iso.packager.GenericPackager[src/main/resources/iso8583.xml] -->
      <field id="0" value="0100"/>
      <field id="2" value="123456"/>
      <field id="3" value="000010"/>
      <field id="4" value="1500"/>
      <field id="7" value="1206041200"/>
      <field id="11" value="000001"/>
      <field id="41" value="12340001"/>
      <field id="49" value="840"/>
    </isomsg>
  </send>
</log>

Сервер:

--- exec-maven-plugin:1.2.1:exec (default-cli) @ AppTest ---
Binding to port 9090, please wait  ...
Server started: ServerSocket[addr=0.0.0.0/0.0.0.0,localport=9090]
Waiting for a client ...
Client accepted: Socket[addr=/127.0.0.1,port=58902,localport=9090]

=> Клиент не может отправить сообщение. Но если я отменю процесс клиентского проекта, Сервер получит сообщение и распечатает журнал:

Message Received: 00730100722000000080800006123456000010000000001500120604120000000112340001840
<isomsg>
  <!-- org.jpos.iso.packager.GenericPackager -->
  <field id="0" value="0110"/>
  <field id="8" value="80000612"/>
  <field id="18" value="3456"/>
  <field id="19" value="000"/>
  <field id="20" value="010"/>
  <field id="23" value="000"/>
  <field id="27" value="0"/>
  <field id="39" value="00"/>
  <field id="57" value=""/>
</isomsg>

person user1222893    schedule 30.07.2020    source источник


Ответы (1)


Проблема в том, что вы пытаетесь получить сообщение, используя readLine, а iso-сообщения не являются строками, заканчивающимися EOL.

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

Было бы лучше использовать ISOServer на своем сервере, а еще лучше полноценный q2 для его реализации.

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

Вы можете просмотреть первые два руководства по jpos здесь http://www.jpos.org/tutorials. получить представление о том, как настроить сервер с прослушивателем запросов для обработки запросов.

person Andrés Alcarraz    schedule 30.07.2020
comment
Спасибо. Я попытался последовать вашему предложению, и это сработало. :D - person user1222893; 31.07.2020