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:
В этом примере демонстрируется, как настроить взаимодействующие адаптеры каналов как на стороне клиента, так и на стороне сервера, а также один способ сопоставления ответов на соответствующий запрос.