TcpSendingMessageHandler с совместной работой TcpReceivingChannelAdapter

В Spring Integration я использую пару канальных адаптеров для отправки / получения сообщений от сокета сервера. Я всегда создаю клиентские соединения со следующими адаптерами:

@Bean
public TcpReceivingChannelAdapter tcpIn(AbstractClientConnectionFactory connectionFactory) throws Exception {
    TcpReceivingChannelAdapter receiver = new TcpReceivingChannelAdapter();
    receiver.setOutputChannel(fromTcp ());
    receiver.setConnectionFactory(connectionFactory);
    return receiver;
}

@Bean
@ServiceActivator(inputChannel = "toTcp")
public TcpSendingMessageHandler tcpOut(AbstractClientConnectionFactory connectionFactory) throws Exception {
    TcpSendingMessageHandler sender = new TcpSendingMessageHandler();
    sender.setConnectionFactory(connectionFactory);
    sender.setClientMode(true);
    return sender;
}

Проблема здесь в том, что сервер отвечает в том же сокете на удаленный порт (мой открытый порт сокета). Например, если я подключаю сокет к 127.0.0.1:4444, сервер отвечает на мой открытый порт (динамически с Socket tcp) 6873 вместо 4444. Он использует тот же сокет.

Быстрый ответ может быть использовать TcpOutboundGateway но у меня есть несколько проблем с этим сценарием:

  • Мне нужно управлять событиями соединения без учета операций отправки / чтения. Например, я должен автоматически подключиться и открыть сокет перед отправкой любого сообщения.
  • Согласно документации:

для сообщений большого объема рассмотрите возможность использования совместной пары адаптеров каналов. Однако вам нужно будет предоставить логику совместной работы.

Какой компонент следует использовать для сокетов запросов / ответов в сценарии большого объема?

1 ответ

Просто прочитайте Справочное руководство со слов:

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

Также взгляните на пример TCP Multiplex:

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

Другие вопросы по тегам