Как запустить маршруты Camel на подчиненном ActiveMQ только тогда, когда подчиненное устройство становится активным при отработке отказа?

У меня есть надежный потребитель для удаленной очереди JMS во встроенной маршрутизации Camel. Возможна ли такая маршрутизация с конфигурацией master-slave? Теперь кажется, что маршруты Camel запускаются и активируются уже при запуске подчиненного ActiveMQ, а не при фактическом аварийном переключении.

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

Я использую ActiveMQ 5.3 вместе с Apache Camel 2.1.


person Tommi L.    schedule 14.01.2010    source источник


Ответы (3)


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

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

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

...

</camelContext>

Далее вам нужно создать класс, который реализует интерфейс службы ActiveMQ. Образец этого будет следующим:

package com.fusesource.example;

import org.apache.activemq.Service;
import org.apache.camel.spring.SpringCamelContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Example used to start and stop the camel context using the ActiveMQ Service interface
*
*/
public class CamelContextService implements Service
{
private final Logger LOG = LoggerFactory.getLogger(CamelContextService.class);
SpringCamelContext camel;

@Override
public void start() throws Exception {
    try {
        camel.start();
    } catch (Exception e) {
        LOG.error("Unable to start camel context: " + camel);
        e.printStackTrace();
    }
}

@Override
public void stop() throws Exception {
    try {
        camel.stop();
    } catch (Exception e) {
        LOG.error("Unable to stop camel context: " + camel);
        e.printStackTrace();
    }
}

public SpringCamelContext getCamel() {
    return camel;
}

public void setCamel(SpringCamelContext camel) {
    this.camel = camel;
}
}

Затем в файл конфигурации брокера, activemq.xml, добавьте следующее, чтобы зарегистрировать службу:

<services>
      <bean xmlns="http://www.springframework.org/schema/beans" class="com.fusesource.example.CamelContextService">
          <property name="camel" ref="camel"/>
      </bean>
</services>

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

Я также разместил блог об этом здесь: http://jason-sherman.blogspot.com/2012/04/activemq-how-to-startstop-camel-routes.html

person Jason Sherman    schedule 30.04.2012

это не должно быть проблемой, потому что контекст/маршруты Camel на подчиненном устройстве не запустятся, пока оно не станет ведущим (когда мастер снимает блокировку файла хранилища сообщений)

person Ben ODay    schedule 15.02.2010

С помощью политик верблюжьих маршрутов вы можете решить приостановить/возобновить определенные маршруты в зависимости от ваших собственных условий. http://camel.apache.org/routepolicy.html

Существует существующая политика ZookeeperRoutePolicy, которую можно использовать для выбора лидера. http://camel.apache.org/zookeeper.html (см. внизу страницы)

person JoG    schedule 05.01.2013