2013-11-02 4 views
4

Чтобы начать, я просто хочу сообщить, что я новичок в Camel, и совсем недавно я понял его основные понятия.Базовый Apache Camel LoadBalancer Failover Пример

Я пытаюсь создать базовый рабочий пример, используя Apache-Camel с ActiveMQ в качестве брокера и используя jms-компонент в качестве клиента loadbalancer, используя конструкцию failover. Все это делается только с использованием Java DSL (если возможно).

Пример состоит из 4 основных приложений, называемых MyApp-A, MyApp-B, MyApp-C и MyApp-D. В обычном сценарии MyApp-A считывает файл с моего компьютера, а затем преобразует его в сообщение. Затем он отправляет это сообщение в MyApp-B, а MyApp-B отправляет его в MyApp-C.

enter image description here

Однако есть провал сценарий. В этом случае MyApp-A не отправляет сообщение в MyApp-B. Затем он отправляет сообщение в MyApp-D, которое, в свою очередь, отправляет его в MyApp-C.

enter image description here

пыльник это мой код для MyApp-A

public class MyApp-A { 

    public static void main(String args[]) throws Exception { 
     // create CamelContext 
     CamelContext context = new DefaultCamelContext(); 

     // connect to embedded ActiveMQ JMS broker 
     ConnectionFactory connectionFactory = 
      new ActiveMQConnectionFactory("vm://localhost"); 
     context.addComponent("jms", 
      JmsComponent.jmsComponentAutoAcknowledge(connectionFactory)); 

     // add our route to the CamelContext 
     context.addRoutes(new RouteBuilder() { 
      @Override 
      public void configure() { 
       from("file:data/inbox?noop=true")loadbalancer().failover().to("MyApp-B:incomingOrders").to("MyApp-D:incomingOrders").end(); 
      } 
     }); 

     // start the route and let it do its work 
     context.start(); 
     Thread.sleep(10000); 

     // stop the CamelContext 
     context.stop(); 
    } 
} 

Я рассмотрел используя camel-ftp, но это не будет работать, потому что MyApp-C не будет знать, что MyApp-B умер и будет не знаю, что он должен был получить от MyApp-D.

Теперь у меня есть несколько проблем и вопросов:

  1. Как отправить сообщение (в данном случае файл) из MyApp-A к MyApp-B, который является другим приложением? Что я должен использовать в методе .to(String) Java DSL?
  2. Как мне на самом деле закодировать MyApp-B? Как я могу получить сообщение от A (это другое приложение, возможно, на другом компьютере) и отправить его в MyApp-C (я предполагаю, что если я узнаю, как отправить от MyApp-A к MyApp-B, Я буду знать, как отправить из MyApp-B в MyApp-C)?
  3. Как MyApp-A обнаружит, что MyApp-B не удалось?
  4. Какой компонент верблюда следует использовать?

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

ответ

1

После многих усилий я нашел способ реализовать это, основываясь на примере loadbalancer, представленном apache.

Я uploadded проект затмения на мой GitHub счет, вы можете проверить его здесь работает:

Хотя мой пример не уважает общую предполагаемую архитектуру, она имеет несколько отличий как описано ниже:

  • Он использует Spring DSL вместо Java DSL
  • MyApp-A - это loadbalancer. Каждые 10 он генерирует отчет (вместо чтения файла) и отправляет его в MyApp-B.
  • MyApp-В соответствует MINA серверу 1 на локальном хосте: 9991
  • MyApp-С соответствует MINA серверу 3 на локальном хосте: 9993
  • MyApp-D соответствует MINA серверу 2 на локальном хосте: 9992
  • Когда MyApp -C получает отчет, он отправляет его обратно в MyApp-A

Кроме того, также неясно, когда, где и почему MyApp-C отвечает на MyApp-A с измененным отчетом. Такое поведение не указано в Spring DSL-коде, и до сих пор никто не мог объяснить мне, почему это происходит.

Так две проблемы остаются:

  1. Как бы это сделать с помощью Java DSL
  2. Почему MyApp-C отвечая на MyApp-А и как он делает это?

В случае, если вы заинтересованы, Вот README.txt я создал, с точным описанием проблемы:

балансировка нагрузки с MINA Пример

Этот пример показывает, как вы можете легко используйте компонент Camel-MINA до , разработав решение, позволяющее отказоустойчивое решение, которое перенаправляет запросы, когда сервер не работает. Эти серверы просты: Серверы TCP/IP, созданные инфраструктурой Apache MINA, и работают в автономных JVM .

В этом примере клиент балансировки нагрузки будет генерировать отчет каждые 10 секунд и отправить этот отчет на сервер MINA, работающий на localhost: 9991. Затем этот сервер пересылает отчет на сервер MINA , работающий на localhost: 9993, который затем возвращает отчет клиенту , чтобы он мог распечатать его на консоли. Каждый сервер MINA будет изменить тело сообщения, чтобы вы могли видеть маршруты, которые должен был использоваться отчет . Если по какой-либо причине (скажем, вы нажали CTRL + C), сервер MINA, работающий на localhost: 9991, не работает, тогда загрузчик нагрузки автоматически начнет использовать сервер MINA, работающий на localhost: 9992. Как только этот сервер MINA получит отчет, он отправит его обратно на сервер MINA, работающий на локальном хосте: 9993, например , ничего не произошло. Если localhost: 9991 снова возвращается, то loadbalancer снова начнет использовать его.

Балансировщик нагрузки всегда будет пытаться использовать localhost: 9991 до , пытаясь использовать localhost: 9992 независимо от того, что.

Запуск примера

Для компиляции и установки проекта в вашем Maven репо, выполнить следующую команду в корневом каталоге проекта

МВН чистой установки

Чтобы запустить пример, то выполните следующую команду в соответствующей папке:

минÀ1 и:
МВН Exec: Java -Pmina1

mina2: МВН Exec: Java -Pmina2

mina3: МВН Exec: Java -Pmina3

балансировки нагрузки: МВН Exec: Java -Ploadbalancer

Если вы попали какие-либо проблемы, пожалуйста, сообщите нам на форуме Camel
http://camel.apache.org/discussion-forums.html


Педро Мартинс!


EDIT

В предыдущем посте у меня было 2 вопроса: 1. , как сделать это в Java DSL 2. Почему же Mina серверы отправки ответов.

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

Kudos к г-Клауса для ответа и предложений.


EDIT

Обе проблемы теперь решены, и они оба в том же хранилище Git. Надеюсь, мой код помогает людям.

Смежные вопросы