На моем верблюжьем компьютере для обмена текстовыми сообщениями развернут следующий маршрут:
<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&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&synchronous=true&textline=true&
clientMode=true&exchangePattern=InOut&
requestTimeout=10000&disconnect=false"></toD>
<log message="Received response from server: ${body}" />
</route>
</routes>
Требования к TCP-соединению состоят в том, что мне как клиенту необходимо подключиться к серверу, отправить запрос, получитьответ, без отключения соединения.
В настоящее время у меня проблемы с тем, что, хотя я могу отправить сообщение, я не могу получить ответ. После того, как сообщение было отправлено, обмен находится в полете и застревает до тех пор, пока не истечет время ожидания.
Поэтому я решил посмотреть трафик на localhost, чтобы увидеть, что происходит, вот результат:
Результаты Wireshark
- Я отправляю свой запрос на сервер и получаю подтверждение ACK (помечено красным)
- Я получаю ответ и подтверждаю его получение, отправляя ACK (помеченожелтый)
- Я пытаюсь закрыть соединение, отправив на сервер флаг FIN (отмечен черным цветом)
Как видно, сам обмен данными происходитбез проблем.
Но каким-то образом, хотя я упоминал в параметре параметров конечной точки netty disconnect = false , он все равно пытается закрыть соединение, отправив пакет с флагом FIN. Поскольку сервер не отправляет обратно флаг FIN, я застрял с exchange до истечения времени ожидания. Я попытался установить параметр reuseChannel = true , но каким-то образом верблюд не может разрешить конечную точку, так как этот параметр для него неизвестен.
Почему параметр connect = false не работает, и мой клиент пытаетсязакрыть соединение в любом случае?
Почему опция reuseChannel почему-то неизвестна, даже если она указана на странице документации apache-camel netty ?
Я использую Camel в версии 2.23.1, иlib верблюда-netty находится в той же версии, без пользовательской конфигурации обработки связи netty.
РЕДАКТИРОВАТЬ: Я, вероятно, неправильно интерпретировал пакет FIN, так как после просмотра предоставленного мною снимка экрана -время между получением ответа и отправкой FIN слишком велико для применения к одному и тому же потоку - можно с уверенностью предположить, что этот пакет был отправлен, когда истекло время ожидания обмена.