Netty Camel Endpoint пытается закрыть соединение, хотя у меня есть опция disconnect = false - PullRequest
0 голосов
/ 25 октября 2019

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

<routes xmlns="http://camel.apache.org/schema/spring" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring-2.23.1.xsd">
    <route id="100_1_vision_vlc_communication_request_send_request_message_url_abcd">
        <from uri="activemq:queue:myQueue?concurrentConsumers=1&amp;maxConcurrentConsumers=1" />
        <onException>
            <exception>java.io.IOException</exception>
            <redeliveryPolicy maximumRedeliveries="5" redeliveryDelay="5"/>
        </onException>
        <log message="Sending message with body: ${body}" />
        <toD uri="netty:tcp://${headers.hostAddressMessageHeader}:${headers.hostPortMessageHeader}
                  ?sync=true&amp;synchronous=true&amp;textline=true&amp;
                   clientMode=true&amp;exchangePattern=InOut&amp;
                   requestTimeout=10000&amp;disconnect=false"></toD>
        <log message="Received response from server: ${body}" />
    </route>
</routes>

Требования к TCP-соединению состоят в том, что мне как клиенту необходимо подключиться к серверу, отправить запрос, получитьответ, без отключения соединения.

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

Поэтому я решил посмотреть трафик на localhost, чтобы увидеть, что происходит, вот результат:

Результаты Wireshark

  1. Я отправляю свой запрос на сервер и получаю подтверждение ACK (помечено красным)
  2. Я получаю ответ и подтверждаю его получение, отправляя ACK (помеченожелтый)
  3. Я пытаюсь закрыть соединение, отправив на сервер флаг FIN (отмечен черным цветом)

Как видно, сам обмен данными происходитбез проблем.

Но каким-то образом, хотя я упоминал в параметре параметров конечной точки netty disconnect = false , он все равно пытается закрыть соединение, отправив пакет с флагом FIN. Поскольку сервер не отправляет обратно флаг FIN, я застрял с exchange до истечения времени ожидания. Я попытался установить параметр reuseChannel = true , но каким-то образом верблюд не может разрешить конечную точку, так как этот параметр для него неизвестен.

Почему параметр connect = false не работает, и мой клиент пытаетсязакрыть соединение в любом случае?

Почему опция reuseChannel почему-то неизвестна, даже если она указана на странице документации apache-camel netty ?

Я использую Camel в версии 2.23.1, иlib верблюда-netty находится в той же версии, без пользовательской конфигурации обработки связи netty.

РЕДАКТИРОВАТЬ: Я, вероятно, неправильно интерпретировал пакет FIN, так как после просмотра предоставленного мною снимка экрана -время между получением ответа и отправкой FIN слишком велико для применения к одному и тому же потоку - можно с уверенностью предположить, что этот пакет был отправлен, когда истекло время ожидания обмена.

...