2010-01-14 5 views
6

J'ai un consommateur durable dans une file d'attente JMS distante dans le routage Camel intégré. Est-il possible d'avoir ce type de routage avec une configuration maître-esclave? Maintenant, il semble que les routes Camel sont déjà démarrées et activées lorsque l'esclave ActiveMQ est démarré et non lorsque le basculement réel se produit.Comment démarrer les itinéraires Camel sur l'esclave ActiveMQ uniquement lorsque l'esclave devient actif dans le basculement?

Maintenant, l'instance esclave reçoit les mêmes messages qui sont également envoyés au maître, ce qui entraîne l'arrivée de messages en double dans la file d'attente lors du basculement. J'utilise ActiveMQ 5.3 avec Apache Camel 2.1.

Répondre

1

cela ne devrait pas être un problème parce que le contexte Camel/routes sur l'esclave ne démarre pas jusqu'à ce qu'il devienne le maître (lorsque le verrouillage du fichier de stockage des messages est libéré par le maître)

3

Malheureusement, lorsque l'esclave le courtier commence ainsi le CamelContext avec les routes. Cependant, vous pouvez accomplir cela en procédant comme suit:

Sur le camelContext déployé avec un courtier esclave ajouter ce qui suit autoStartup attribut pour éviter les routes de départ:

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

... 

</camelContext> 

Ensuite, vous devez créer une classe qui implémente la Interface de service ActiveMQ. Un échantillon de ce serait comme suit:

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

ensuite dans le fichier de configuration du courtier, activemq.xml, ajouter ce qui suit pour enregistrer le service:

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

Maintenant, une fois que le courtier esclave prend la le maître, la méthode start sera invoquée sur la classe de service et les routes seront démarrées.

J'ai également posté un blog sur ce ici: http://jason-sherman.blogspot.com/2012/04/activemq-how-to-startstop-camel-routes.html

Questions connexes