Возврат ответа от входящего шлюза TCP - PullRequest
0 голосов
/ 02 мая 2019

Я застрял на казалось бы простой задаче, но у меня нет идей.У меня есть TcpInboundGateway, прикрепленный к TcpNetServerConnectionFactory, который передает запросы активатору службы.Service Activator просто помещает сообщение обратно на канал ответа шлюза.Я хочу, чтобы шлюз возвращал это сообщение по соединению.

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

Кажется, проблема в том, что шлюз не считывает данные с этого канала, хотя я установил его в setReplyChannel().Я также вижу это в журналах:

Adding {bridge:null} as a subscriber to the 'testResponseChannel' channel

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

Вот конфигурация:

    @Bean
    public TcpNetServerConnectionFactory testServerFactory() {
        TcpNetServerConnectionFactory testServerFactory = new TcpNetServerConnectionFactory(0);
        testServerFactory.setSerializer(TcpCodecs.lengthHeader2());
        testServerFactory.setDeserializer(TcpCodecs.lengthHeader2());
        return testServerFactory;
    }

    @Bean
    public DirectChannel testRequestChannel() {
        return new DirectChannel();
    }

    @Bean
    public DirectChannel testResponseChannel() {
        DirectChannel testResponseChannel = new DirectChannel();
        testResponseChannel.addInterceptor(channelInterceptor());
        return testResponseChannel;
    }

    @Bean
    public TcpInboundGateway gateway() {
        TcpInboundGateway gateway = new TcpInboundGateway();
        gateway.setConnectionFactory(testServerFactory());
        gateway.setRequestChannel(testRequestChannel());
        gateway.setReplyChannel(testResponseChannel());
        return gateway;
    }

    @Bean
    @ServiceActivator(inputChannel = "testRequestChannel", outputChannel = "testResponseChannel")
    public EchoHandler echoHandler() {
        return new EchoHandler();
    }

Вот мой активатор службы POJO:

public class EchoHandler {

    public Message<String> echoMessage(Message<String> request) {
        System.out.println(request.getPayload());
        return request;
    }
}

А вот ошибка, которая возникает сразу после того, как сообщение проходит через перехватчик:

Unexpected message - no endpoint registered with connection interceptor: localhost:6060:59848:3c6c3cff-c697-4fc9-b4e3-9ea14508cec7 - GenericMessage [payload=byte[3], headers={ip_tcp_remotePort=6060, ip_connectionId=localhost:6060:59848:3c6c3cff-c697-4fc9-b4e3-9ea14508cec7, ip_localInetAddress=/127.0.0.1, ip_address=127.0.0.1, id=93c75664-54db-c93e-ab3a-3e06b1e4b626, ip_hostname=localhost, timestamp=1556828832645}]

1 Ответ

1 голос
/ 03 мая 2019

Чтобы правильно реагировать на ответ от сервера, ваш клиент должен иметь возможность запроса-ответа.Для этого IP-модули Spring Integration предлагают TcpOutboundGateway.Таким образом, TcpListener будет зарегистрирован на TcpConnection и готов анализировать и обрабатывать ответы на сообщения в сокете.

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