Весенняя интеграция. Неизвестный хост и фабрика TCP-соединений

Я реализую TCP-клиент с помощью Spring Integration. Требования: 1. Через UDP-соединение (откуда-то) получите IP-адрес или адрес хоста TCP-сервера. 2. Откройте TCP-соединение с сервером, с целевым хостом из предыдущего шага и отправьте некоторые бизнес-данные на этот сервер.

Я использую среду интеграции Spring, версия "2.2.0.RELEASE", и проблема в том, что в конфигурации по умолчанию tcp-connection-factory атрибут host должен быть "жестко запрограммированным" в xml. Например:

<ip:tcp-connection-factory id="client" type="client" host="localhost" port="1234" single-use="true"/>

Вопрос в том, как избежать статического определения целевого хоста в контексте приложения и иметь возможность «лениво» инициализировать tcp-connection-factory, когда целевой хост будет известен.

Я знаю, что этот поток может быть легко реализован стандартными сетевыми API-интерфейсами Java, и вопрос касается API-интерфейса Spring-Integration.


person jshark    schedule 29.01.2014    source источник


Ответы (3)


На данный момент конфигурация статична.

Однако вы можете использовать метод, аналогичный тому, который использовался в пример динамического ftp, который настраивает исходящие ftp-адаптеры во время выполнения.

person Gary Russell    schedule 29.01.2014
comment
Также текущая версия в потоке 2.2.x - 2.2.6, пожалуйста, не используйте такую ​​старую версию. - person Gary Russell; 29.01.2014
comment
да, вы абсолютно правы, но не всегда это возможно из-за ограничений «корпоративных» организаций. Во всяком случае, в моем случае он уже обновлен до последней версии :) - person jshark; 03.02.2014

Поскольку <int-ip:tcp-connection-factory> предоставляет некоторый экземпляр AbstractConnectionFactory. А с другой стороны <int-ip:tcp-outbound-channel-adapter> применяет этот экземпляр через connection-factory, поэтому нет никаких препятствий для реализации вашего собственного RoutingConnectionFactory.

Реализация может полагаться на какое-то значение из ThreadLocal. Идея здесь:

https://github.com/spring-projects/spring-amqp/blob/master/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/connection/AbstractRoutingConnectionFactory.java ,

https://github.com/spring-projects/spring-framework/blob/master/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSource.java

person Artem Bilan    schedule 29.01.2014
comment
Спасибо за отзыв. Единственная проблема, которую я вижу прямо сейчас с этим подходом, заключается в том, что мне нужно использовать отражение, чтобы повторно инициализировать поля host и port в AbstractConnectionFactory или повторно реализовать весь стек. начиная с интерфейса ConnectionFactory. Оба метода плохие IMO, и текущий API предполагает неизменное состояние этих полей. - person jshark; 03.02.2014
comment
Фактически, после некоторого дополнительного исследования я обнаружил, что реализация ConnectionFactory с дополнительным «динамическим» методом для определения хоста и порта очень хорошо подходит для моих нужд. Спасибо еще раз! - person jshark; 03.02.2014
comment
@jshark - У меня та же проблема. Не могли бы вы поделиться своим решением? Спасибо. - person Michael; 11.10.2015

В настоящее время это невозможно / просто - даже если вы настроите или расширите класс для tcp-connection-factory, чтобы иметь возможность подключаться к меняющимся хостам. Существует запрос на открытие новой функции в JIRA, чтобы обеспечить эту функциональность.

person zacheusz    schedule 20.08.2015