2010-01-14 16 views
6

Tengo un consumidor duradero para una cola JMS remota en el enrutamiento encamado de Camel. ¿Es posible tener este tipo de enrutamiento con la configuración maestro-esclavo? Ahora parece que las rutas de Camel ya se han iniciado y activado cuando se inicia el ActiveMQ esclavo y no cuando se produce el failover real.¿Cómo iniciar las rutas Camel en ActiveMQ esclavo solo cuando el esclavo se activa en failover?

Ahora causa que la instancia esclava reciba los mismos mensajes que también se envían al maestro y esto hace que los mensajes duplicados lleguen a la cola en conmutación por error.

Estoy usando ActiveMQ 5.3 junto con Apache Camel 2.1.

Respuesta

1

esto no debería ser un problema porque el contexto/rutas de camellos en el esclavo no se iniciará hasta que se convierte en el maestro (cuando el bloqueo de archivo de almacén de mensajes es liberada por el maestro)

3

Por desgracia, cuando el esclavo Broker starts también lo hace CamelContext junto con las rutas. Sin embargo se puede lograr esto haciendo lo siguiente:

Por camelContext desplegado con el corredor de esclavos, agregue el siguiente autoStartup atributo para evitar las rutas de inicio:

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

... 

</camelContext> 

continuación, tiene que crear una clase que implementa la Interfaz de servicio ActiveMQ. Una muestra de esto sería como sigue:

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

Luego, en el archivo de configuración del agente, activemq.xml, añadir lo siguiente para registrar el servicio:

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

Ahora, una vez que el agente esclavo asume el cargo de el maestro, el método de inicio se invocará en la clase de servicio y las rutas se iniciarán.

También han publicado un blog sobre esto aquí: http://jason-sherman.blogspot.com/2012/04/activemq-how-to-startstop-camel-routes.html

Cuestiones relacionadas