Программно создать несколько соединений для TcpNetClientConnectionFactory - PullRequest
0 голосов
/ 28 марта 2019

Продолжая разговор с этот вопрос :

Вопрос из двух частей здесь:

Может ли TcpNetClientConnectionFactory иметь несколько соединений с вышестоящим сервер, если хост и порт совпадают?

Если так, как я могу программно построить новое соединение для этого соединения завод? Я вижу метод buildNewConnection, но он защищен.

Первое соединение автоматически создается, как только первое сообщение проходит через фабрику. Что нам нужно сделать, это заметить, когда следующие сообщения иметь другой ip_connectionId, установить новое соединение и направить те Сообщения к этому новому соединению. Очевидно, сообщения с оригиналом ip_connectionId все равно будет перенаправлен на исходное соединение.

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

1 Ответ

1 голос
/ 28 марта 2019

Если фабрика входящих соединений имеет значение TcpNetServerConnectionFactory, вы можете просто использовать ThreadAffinityClientConnectionFactory, поскольку каждое входящее соединение получает свой собственный поток.

Вы бы позвонили getConnection().Это свяжет соединение с потоком (и вы можете получить идентификатор соединения из него), но вам не нужно отображать заголовок в этом направлении из-за близости потока, вам нужно будет отобразить только путь возврата.

Имейте в виду, однако, если ThreadAffinityClientConnectionFactory обнаружит, что соединение было закрыто, оно создаст новое.Таким образом, вы можете звонить getConnection() в вашем маппере при каждом вызове.Тем не менее, условия гонки все равно будут присутствовать, поэтому вам также может потребоваться прослушать TcpConnectionCloseEvent s и TcpConnectionOpenEvent s.

Если вы используете NIO на входящем или иначе передаете работу другомупотоки через исполнителя, это не сработает.

В этом случае вам понадобится ваша собственная фабрика оберточных соединений - вы можете использовать ThreadAffinityClientConnectionFactory в качестве модели, но вместо хранения соединений в ThreadLocal, вы бы сохранили их на карте.Но вам все равно понадобится ThreadLocal (установить upstream при каждом вызове), чтобы сообщить фабрике, какое соединение следует раздавать, когда адаптер запрашивает его.

Однако есть хитрость, о которой вы должны знать..

На фабрике соединений существует свойство singleUse.Это служит 2 целям;

  • Во-первых, он сообщает фабрике, что каждый раз при каждом вызове getConnection() вместо одного общего общего соединения
  • секунда создается новое соединение, он сообщает входящему адаптеру о закрытии.соединение после получения ответа

Таким образом, хитрость заключается в том, что вам нужно singleUse=true на реальном заводе (чтобы оно давало вам новое соединение каждый раз, когда вызывается getConnection()), но singleUse=falseна фабрике упаковки, чтобы адаптеры не закрывали соединение.

Я предлагаю вам взглянуть на фабрику соединений ThreadAffinityClientConnectionFactory и CachingClientConnectionFactory, чтобы увидеть, как они работают.

Вероятно, нам следуетрассмотрите возможность разбиения этого на два логических значения;мы могли бы также сделать некоторые улучшения, чтобы избежать необходимости в локальном потоке, добавив что-то вроде getConnection(String connectionId) к клиентскому заводскому контракту и заставив фабрику искать соединение внутри себя;но это потребует работы с адаптерами.

Я пойму проблему для этого и посмотрю, сможем ли мы получить что-то в 5.2.

Скорее длинный ответ, но я надеюсь, что это имеет смысл.

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