Apache Camel для стримера на основе TCP

Необходимо, чтобы TCP-сервер на базе Camel (Mina/Netty) работал на определенном порту, что позволяет подключаться к нему нескольким TCP-клиентам. Потоковое содержимое доступно в файлах, и TCP-сервер должен отправлять каждую строку в текстовых файлах одному из подключенных клиентов (циклический перебор).

Может кто-нибудь помочь мне с планом верблюжьего пути, чтобы добиться этого?

Также возможно регулировать скорость потоковой передачи, например, 100 мсг / сек на подключенного клиента?

Заранее спасибо.

MK

1 ответ

Я сделал что-то вроде этого. Ну, не совсем то, что вы хотите, но я могу сделать несколько предложений о том, как начать.

Давайте используем компонент MINA для этого маршрута, так как у меня были некоторые проблемы с компонентом Netty, см. Эту ссылку Исключение выдается из Apache Camel Netty Consumer, когда данные отправляются несколькими клиентами. По-видимому, это было исправлено, но так как мой проект был отменен, я никогда не проверял его снова.

Так что из вашего описания это будет протокол на основе текстовой строки, простой маршрут для этого будет выглядеть так в DSL

<route>
   <from uri="mina2:tcp://localhost:5555?textline=true"/>
   <to uri="bean:fileProcessing"/>
</route>

Этот маршрут откроет прослушивающий сокет на локальном хосте на порту 5555. Маршрут также настроен на использование текстового кодека. Кодек текстовой строки - это, по сути, строка текста, заканчивающаяся символом конца строки, т.е. \n, Если вы собираетесь использовать какой-то другой протокол, вам нужно рассмотреть следующие пункты:

  • ProtocolEncoder - ProtocolEncoder выполняет задачу получения входной полезной нагрузки и помещения байтов в канал TCP.
  • ProtocolDecoder - ProtocolDecoder интерпретирует пользовательское двоичное сообщение протокола для того, что может понять ваше приложение.
  • ProtocolCodecFactory - это создает кодер и декодер.

Вы могли бы реализовать некоторую логику в fileProcessing боб, чтобы отправить ответы обратно. Однако есть одна проблема, которую клиенты должны будут запросить, когда они будут готовы получить новую линию. Из моего понимания это вытекает из сценария ответа на запрос. Однако из того, что я видел, маршрут активен только тогда, когда поступает сообщение от клиента к серверу.

Возможно, есть способ инициировать отправку с сервера, но вам нужно будет поэкспериментировать с этим, когда я сделаю это, я сам ничего такого не делал.

Критическое чтение будет следующим.

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

ОБНОВИТЬ:

Поэтому я провел небольшое исследование по этому вопросу, и кажется невозможным отправлять события с сервера на клиент без использования одного из следующих шаблонов InOnly и InOut.

Попробуйте просто использовать MINA или Netty.

Другие вопросы по тегам