Как отправить сообщение ISO8583 от клиента к серверу с помощью jreactive-8583?

Я настроил и клиент, и сервер, используя jreactive-8583. Клиент успешно подключается к серверу. Но я не могу отправить сообщение ISO8583 от клиента на сервер. Я недавно узнал об этом, и мне трудно понять проблему и решить ее.

Код на стороне клиента

package com.jreactive.demo;

import java.io.File;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.concurrent.TimeUnit;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.github.kpavlov.jreactive8583.IsoMessageListener;
import com.github.kpavlov.jreactive8583.client.Iso8583Client;
import com.solab.iso8583.IsoMessage;
import com.solab.iso8583.IsoType;
import com.solab.iso8583.MessageFactory;
import com.solab.iso8583.impl.SimpleTraceGenerator;
import com.solab.iso8583.parse.ConfigParser;

import io.netty.channel.ChannelHandlerContext;

public class HelloMessage {

    public static IsoMessage createMessage() {
        MessageFactory<IsoMessage> mf = new MessageFactory<IsoMessage>();

        try {
            String path="j8583.xml";
            ConfigParser.configureFromUrl(mf, new File(path).toURI().toURL());
        } catch (IOException e) {
            e.printStackTrace();
        }

        mf.setForceSecondaryBitmap(true);
        mf.setUseBinaryBitmap(true);
        mf.setAssignDate(true); // This sets field 7 automatically
        mf.setTraceNumberGenerator(new SimpleTraceGenerator((int)  (System.currentTimeMillis() % 100000)));

        IsoMessage m = mf.newMessage(0x200); // You must use 0x200, 0x400, etc.
        m.setValue(3, "000000", IsoType.ALPHA, 6);
        m.setValue(11, "000001", IsoType.ALPHA, 6);
        m.setValue(41, "3239313130303031", IsoType.ALPHA, 16);
        m.setValue(60, "001054455354204D45535347", IsoType.ALPHA, 24);
        m.setValue(70, "0301", IsoType.ALPHA, 4);
        m.setForceSecondaryBitmap(true);

        System.out.println(m.debugString());

        return m;
    }

    @SuppressWarnings("deprecation")
    public static void main(String[] args) throws InterruptedException, IOException {
        MessageFactory<IsoMessage> messageFactory = ConfigParser.createDefault();// [1]
        //@SuppressWarnings("deprecation")
        //Iso8583Client<IsoMessage> client = new Iso8583Client<>(messageFactory);// [2]
        System.out.println("hello*************");
        System.out.println(createMessage().debugString());
        System.out.println("hello**************");

        SocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8090);
        Iso8583Client<IsoMessage> client = new Iso8583Client<>(socketAddress, messageFactory);

        client.addMessageListener((IsoMessageListener<IsoMessage>) new IsoMessageListener<IsoMessage>() { // [3]

            public boolean applies(IsoMessage arg0) {

                return false;
            }

            public boolean onMessage(ChannelHandlerContext arg0, IsoMessage arg1) {

                return false;
            }
        });

        client.getConfiguration().setReplyOnError(true);// [4]
        client.init();// [5]

        client.connect("127.0.0.1", 8090);// [6]
        if (client.isConnected()) { // [7]

            System.out.println("hello****************************8");
            IsoMessage message = createMessage();
            System.out.println(message.debugString());
            //...
            client.sendAsync(message);// [8]
            // or
            client.send(message);// [9]
            // or
            client.send(message, 1, TimeUnit.SECONDS);// [10]
        }

        //...
        //client.shutdown();// [11]
    }
}

Код на стороне сервера

package com.jreactive.demo;

import java.io.File;
import java.io.IOException;

import com.github.kpavlov.jreactive8583.IsoMessageListener;
import com.github.kpavlov.jreactive8583.server.Iso8583Server;
import com.solab.iso8583.IsoMessage;
import com.solab.iso8583.IsoType;
import com.solab.iso8583.MessageFactory;
import com.solab.iso8583.parse.ConfigParser;

import io.netty.channel.ChannelHandlerContext;

public class JreactiveServer {
    public static void main(String[] args) throws InterruptedException, IOException {

        System.out.println("hello*****************************");
        MessageFactory<IsoMessage> messageFactory = ConfigParser.createDefault();// [1]
        Iso8583Server<IsoMessage> server = new Iso8583Server<>(8090, messageFactory);// [2]

        server.addMessageListener((IsoMessageListener<IsoMessage>) new IsoMessageListener<IsoMessage>() { // [3]
            @Override
            public boolean applies(IsoMessage isoMessage) {
                return isoMessage.getType() ==  0x200;
            }

            @Override
            public boolean onMessage(ChannelHandlerContext ctx, IsoMessage isoMessage) {
                IsoMessage capturedRequest = isoMessage;
                System.out.println(capturedRequest);
                System.out.println("we got a message ***********************");
                final IsoMessage response = server.getIsoMessageFactory().createResponse(isoMessage);
                response.setField(39, IsoType.ALPHA.value("00", 2));
                response.setField(60, IsoType.LLLVAR.value("XXX", 3));
                ctx.writeAndFlush(response);
                return false;
            }
        });
        server.getConfiguration().setReplyOnError(true);// [4]
        server.init();// [5]

        server.start();// [6]
        if (server.isStarted()) { // [7]
            System.out.println("server has started");
        }
        //server.shutdown();// [8]


    }
}

Вот ссылка на файл j8583.xml, который я использую. https://github.com/kpavlov/jreactive-8583/blob/master/src/test/resources/j8583.xml

Я получаю следующую ошибку как от клиента, так и от сервера.

По умолчанию jreactive клиент и сервер отправляют эхо-сообщения каждые 30 секунд, когда они подключены. Таким образом, вам действительно не хватает руководства по синтаксическому анализу для этого типа сообщения (0800, которое является эхо-сообщением в стандарте ISO 8583).


person Behroz    schedule 11.12.2019    source источник


Ответы (1)


У вас есть два варианта:

но я настоятельно рекомендую вам использовать Builder для конфигурации, поскольку часть вашего кода устарела. Пример:

  1. Предоставьте руководство по синтаксическому анализу сообщений в j8583.xml, пример есть в реактивные тесты. Подробнее об этом читайте здесь.
server.getConfiguration().setIdleTimeout(0);

Отключите эхо-сообщения, установив idleTimeout в 0. Пример с вашим кодом:

val serverConfiguration = ServerConfiguration.newBuilder()
  .logSensitiveData(false)
  .replyOnError(true)
  .idleTimeout(0)
  .build();

val server = new Iso8583Server<IsoMessage>(port, serverConfiguration, messageFactory);
  1. 18: 30: 29.435 [nioEventLoopGroup-2-1] ОШИБКА com.solab.iso8583.MessageFactory - ISO8583 MessageFactory не имеет руководства по синтаксическому анализу для типа сообщения 0800 [08000000000000000000] 18: 30: 29.436 [nioEventLoopGroup-2-1] WARN io.netty .channel.DefaultChannelPipeline - событие exceptionCaught () было запущено, и оно достигло конца конвейера. Обычно это означает, что последний обработчик в конвейере не обрабатывал исключение. io.netty.handler.codec.DecoderException: java.text.ParseException: ISO8583 MessageFactory не имеет руководства по синтаксическому анализу для типа сообщения 0800 [08000000000000000000] в io.netty.handler.codec.ByteToMessageDecoder.callDecode (atToMessageioDecoder). .netty.handler.codec.ByteToMessageDecoder.channelRead (ByteToMessageDecoder.java:281) в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerChannelChannelContext.invokeChannelRead (AbstractChannelHandlerChannelChannelContext.java. ) в io.netty.channel.AbstractChannelHandlerContext.fireChannelRead (AbstractChannelHandlerContext.java:352) в io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead (ByteToMessageDecoder.fireChannelRead (ByteToMessageDecoder.FireChannelRead (ByteToMessageDecoder. ByteToMessageDecoder.java:300) в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:374) на io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:360) на io.netty.channel.AbstractChannelHandlerContext.fireChannelRead (AbstractChannelHandlerContext.fireChannelRead (AbstractChannelHandlerContext.fireChannelRead (AbstractChannelHandlerContext.hannelRead (AbstractChannelHandlerContext). : 1422) в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:374) в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelFandlerContext). java: 931) на io.netty.channel.nio.AbstractNioByteChannel $ NioByteUnsafe.read (AbstractNioByteChannel.java:163) на io.netty.channel.nio.NioEventLoop.processSelectedKeycha (NioEventLoop). .nio.NioEventLoop.processSelectedKeysOptimized (NioEventLoop.java:635) в io.netty.channel.nio.NioEventLoop.processSelect edKeys (NioEventLoop.java:552) на io.netty.channel.nio. NioEventLoop.run (NioEventLoop.java:514) в io.netty.util.concurrent.SingleThreadEventExecutor $ 6.run (SingleThreadEventExecutor.java:1050) в io.netty.util.internal.ThreadExecutorMap $ 2.ror74 (Thread.java.java) в io.netty.util.concurrent.FastThreadLocalRunnable.run (FastThreadLocalRunnable.java:30) в java.base / java.lang.Thread.run (Thread.java:834) Вызвано: java.text.ParseException: ISO8583 MessageFactory имеет нет руководства по синтаксическому анализу для типа сообщения 0800 [08000000000000000000] на com.solab.iso8583.MessageFactory.parseMessage (MessageFactory.java:503) на com.solab.iso8583.MessageFactory.parseMessage (MessageFactory.java:366.kpavlov.kpavithub) .jreactive8583.netty.codec.Iso8583Decoder.decode (Iso8583Decoder.java:37) в io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection (ByteToMessageDecoder.java:503) .java: 442) ... 22 общих фрейма om itted
person solnaranu    schedule 25.03.2020