Apache Camel-Master / Slave - PullRequest
       80

Apache Camel-Master / Slave

0 голосов
/ 19 марта 2020

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

Когда я пытаюсь добавить кластеризацию, я получаю сообщение об ошибке ( Причина: java .lang.IllegalStateException: служба CamelCluster не найдена ), и даже я не уверен правильно ли я пытаюсь использовать мой код.

public class RouteCmdLineRunner implements CommandLineRunner {

@Autowired
private Configuration configuration;

@Autowired
private CamelContext camelContext;

@Override
public void run(String... args) {
    CamelClusterService atomixClusterService = new AtomixClusterService();
    atomixClusterService.setId("camel-node-1");
    camelContext.addService(atomixClusterService);
    if (configuration != null && configuration.getRoutes() != null) {
        configuration.getRoutes().forEach(route -> {
            try {
                camelContext.addRoutePolicyFactory(ClusteredRoutePolicyFactory.forNamespace("my-ns"));
                camelContext.addRoutes(new MyRouteBuilder(route, configuration));
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });
    }
  }
}

application.yml

camel:
  component:
    atomix:
      cluster:
        service:
          id: testid-1
          enabled: true
          order: 1
          mode: node
          address: localhost:8081
    master:
      service: AtomixClusterService

camel.clustered.controller.namespace: my-ns
camel.clustered.controller.enabled: true
camel.component.master.service: true

pom. xml

   <dependency>
        <groupId>org.apache.camel.springboot</groupId>
        <artifactId>camel-master-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-atomix-starter</artifactId>
        <version>3.0.0-RC3</version>
    </dependency>
    <dependency>
        <groupId>io.atomix</groupId>
        <artifactId>atomix-all</artifactId>
        <version>1.0.8</version>
    </dependency>
  1. Находится ли кластеризация на верблюде в экспериментальной стадии? https://camel.apache.org/manual/latest/clustering.html
  2. В документации Camel говорится, что у него есть главный компонент, который выполняет отработку отказа. (https://camel.apache.org/components/latest/master-component.html), но я не вижу полного примера кластеризации.
  3. Какая польза от верблюжьего кластерного контроллера?

Хотя есть документация на верблюдах, она все еще не полна и не запутана.

  • Версия верблюда: 3.1.0
  • Spring-boot: 2.2 .5.RELEASE

Любые указатели будут полезны для достижения кластеризации верблюдов. Я что-то упускаю концептуально?

Для этого аварийного переключения у меня нет возможности установить какой-либо новый сервер, например, серверы ZooKeeper / Consul.

1 Ответ

1 голос
/ 20 марта 2020

В примере репозитория camel-spring-boot есть пример: https://github.com/apache/camel-spring-boot/tree/master/examples/camel-example-spring-boot-clustered-route-controller

Глядя на ваш код, я вижу ряд проблем:

  • вы конфигурируете службу кластера программно в вашем методе run, а также используете свойства весенней загрузки
  • конфигурация главного компонента задает AtomixClusterService в качестве службы для использования, но это не похоже на то, что у вас есть компонент с таким именем

Вероятно, одна из двух причин является причиной того, что вы нажали IllegalStateException.

О ваших вопросах:

  1. Да, это все еще эксперимент
  2. В конце кластеризации приведен пример: c (который окончательно не завершен)
  3. кластерный контроллер отвечает за запуск / остановку маршрутов, когда лидерство взято / потеряно автоматически, без добавить любую политику маршрутизации или настроить главный компонент.
...