2010-01-14 15 views
6

Ich habe einen dauerhaften Verbraucher zu einer Remote-JMS-Warteschlange in Embedded Camel Routing. Ist es möglich, diese Art von Routing mit Master-Slave-Konfiguration zu haben? Nun scheint es, dass die Camel-Routen bereits gestartet und aktiviert werden, wenn der Slave ActiveMQ gestartet wird und nicht, wenn das eigentliche Failover stattfindet.Wie starte ich Camel-Routen am Slave-ActiveMQ nur, wenn der Slave im Failover aktiv wird?

Jetzt bewirkt es, dass die Slave-Instanz die gleichen Nachrichten erhält, die auch an den Master gesendet werden. Dies führt dazu, dass bei Failover doppelte Nachrichten in die Warteschlange gelangen.

Ich benutze ActiveMQ 5.3 zusammen mit Apache Camel 2.1.

Antwort

1

dies kein Problem sein soll, weil die Camel Kontext/Routen auf dem Slave nicht gestartet werden, bis sie den Master werden (wenn die Nachrichtenspeicher Dateisperre vom Master freigegeben wird)

3

Leider, wenn der Slave Broker startet also den CamelContext zusammen mit den Routen. Allerdings können Sie dies erreichen, indem Sie folgendermaßen vorgehen:

Auf der camelContext mit Slave-Broker eingesetzt fügen Sie den folgenden autoStartup Attribut die Routen aus starten zu verhindern:

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

... 

</camelContext> 

Weiter Sie eine Klasse erstellen müssen, die implementiert ActiveMQ-Serviceschnittstelle. Eine Probe davon wäre wie folgt:

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; 
} 
} 

dann in Büros Konfigurationsdatei, activemq.xml, fügen Sie folgendes den Dienst registrieren:

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

Nun, wenn der Slave-Broker als übernimmt Der Master, die Startmethode wird in der Serviceklasse aufgerufen und die Routen werden gestartet.

Ich habe geschrieben auch einen Blog über diese hier: http://jason-sherman.blogspot.com/2012/04/activemq-how-to-startstop-camel-routes.html