Пример балансировки нагрузки Camel с использованием Mina с Java DSL

Итак, недавно я начал изучать Camel. В рамках процесса я решил просмотреть все примеры (перечисленные ЗДЕСЬ и доступные, когда вы ЗАГРУЗИТЬ пакет со всеми примерами и документами) и посмотреть, что я мог узнать.

Один из примеров, Балансировка нагрузки с использованием Mina, привлек мое внимание, потому что он использует Mina в разных JVM и имитирует балансировщик нагрузки с циклическим перебором.

У меня есть несколько проблем с этим примером. Сначала он использует Spring DSL вместо Java DSL, который используется в моем проекте и который мне теперь намного легче понять (в основном потому, что я к нему привык). Итак, первый вопрос: есть ли версия этого примера, использующая только Java DSL вместо Spring DSL для маршрутов и bean-компонентов?

Мой второй вопрос связан с кодом. В описании говорится, и я цитирую:

В этой демонстрации каждые десять секунд на сервере балансировки нагрузки Camel создается объект Report. Этот объект отправляется балансировщиком нагрузки Camel на сервер MINA, где затем объект сериализуется. Один из двух серверов MINA (localhost: 9991 и localhost: 9992) получает объект и обогащает сообщение, задавая поле response объекта Report. Ответ возвращается сервером MINA клиенту, который затем записывает ответ в консоль.

Итак, из того, что я прочитал, я понимаю, что сервер MINA 1 (для примера) получает отчет от балансировщика нагрузки, изменяет его, а затем отправляет этот отчет обратно какому-то невидимому клиенту. После проверки кода я не вижу клиентского java-класса или XML, и когда я запускаю, сервер просто отправляет результаты в командную строку. Где клиент ?? Что это за клиент?

Код сервера MINA-1 представлен здесь:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:camel="http://camel.apache.org/schema/spring"
       xsi:schemaLocation="
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
         http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

  <bean id="service" class="org.apache.camel.example.service.Reporting"/>

  <camelContext xmlns="http://camel.apache.org/schema/spring">

    <route id="mina1">
      <from uri="mina:tcp://localhost:9991"/>
      <setHeader headerName="minaServer">
        <constant>localhost:9991</constant>
      </setHeader>
      <bean ref="service" method="updateReport"/>
    </route>

  </camelContext>

</beans>

Я не понимаю, как метод updateReport() волшебным образом печатает объект на моей консоли. Что, если я хочу отправить сообщение на третий сервер MINA? Как бы я это сделал? (Мне нужно было бы добавить новый маршрут и правильно отправить его на URI 3-го сервера?)

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


person Flame_Phoenix    schedule 03.11.2013    source источник


Ответы (2)


Клиент находится на этом маршруте.

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:camel="http://camel.apache.org/schema/spring"
   xsi:schemaLocation="
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

  <bean id="service" class="org.apache.camel.example.service.Generator"/>

  <camelContext xmlns="http://camel.apache.org/schema/spring">

  <route id="sendMessage">
    <from uri="timer://org.apache.camel.example.loadbalancer?period=10s"/>
    <bean ref="service" method="createReport"/>
    <to uri="direct:loadbalance"/>
  </route>

    <!-- use failover load balancer in round robin mode, to automatic failover to next server
         in case of failure -->
  <route id="loadbalancer">
      <from uri="direct:loadbalance"/>
      <loadBalance inheritErrorHandler="false">
        <failover roundRobin="true"/>
        <to uri="mina:tcp://localhost:9991?sync=true"/>
        <to uri="mina:tcp://localhost:9992?sync=true"/>
      </loadBalance>
    <log message="${body}"/>
  </route>
  </camelContext>
</beans>

Обратите внимание, что есть временная составляющая:

<from uri="timer://org.apache.camel.example.loadbalancer?period=10s"/>

Этот компонент вызывает метод createReport служебного компонента, который имеет тип класса: org.apache.camel.example.service.Generator. Это клиент.

Чтобы добавить дополнительный сервер MINA, используйте следующий Spring DSL.

 <loadBalance inheritErrorHandler="false">
    <failover roundRobin="true"/>
    <to uri="mina:tcp://localhost:9991?sync=true"/>
    <to uri="mina:tcp://localhost:9992?sync=true"/>
    <to uri="mina:tcp://localhost:9993?sync=true"/>
 </loadBalance>

Затем создайте третьего потребителя MINA следующим образом:

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:camel="http://camel.apache.org/schema/spring"
   xsi:schemaLocation="
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

  <bean id="service" class="org.apache.camel.example.service.Reporting"/>

  <camelContext xmlns="http://camel.apache.org/schema/spring">

   <route id="mina2">
    <from uri="mina:tcp://localhost:9993"/>
     <setHeader headerName="minaServer">
       <constant>localhost:9993</constant>
     </setHeader>
     <bean ref="service" method="updateReport"/>
    </route>

  </camelContext>

</beans>

Обратите внимание, что для этого потребуется дополнительно запустить сервер MINA3 при запуске примера. Маршруты клиента и балансировщика нагрузки (2 маршрута) находятся в одном файле camel.

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

Последняя рекомендация - купить себе копию Camel In Action. Это действительно отличный способ начать работать с Camel.

Если вам нужны дополнительные разъяснения, пожалуйста, спросите.

person Namphibian    schedule 04.11.2013
comment
Да, как сервер отвечает клиенту? Где то указано? Есть ли у сервера невидимая связь с клиентом? Всегда ли сервер знает IP-адрес клиента? Что, если у меня есть цепочка серверов, как в этом примере ?? Будет ли сервер MyApp-C отправлять ответ MayApp-B, а затем клиенту? Или он отправит ответ клиенту напрямую? - person Flame_Phoenix; 05.11.2013
comment
Что касается изучения SpringDSL, я знаю, что у него много поклонников, и теперь я начинаю понимать его на приемлемом уровне. Но в проекте, над которым я работаю, он не используется, поэтому у меня связаны руки. - person Flame_Phoenix; 05.11.2013
comment
Не забудьте отредактировать сообщение, чтобы я мог выбрать его в качестве ответа! - person Flame_Phoenix; 05.11.2013

В предыдущем посте у меня было 2 вопроса: 1. Как добавить еще один сервер mina 2. Почему серверы mina отправляют ответы.

Namphibian ответил на проблему 1, но не на проблему 2. Однако я нашел решение здесь: http://camel.465427.n5.nabble.com/Load-balancing-using-Mina-example-with-Java-DSL-td5742566.html#a5742585

Престижность господину Клаусу за ответ и предложения.

PS: Если вы отредактируете свой пост, чтобы он содержал эту информацию, я с радостью выберу ее в качестве ответа.

person Flame_Phoenix    schedule 05.11.2013