2010-01-14 14 views
6

devo beni durevoli di consumo ad una coda remota JMS in incorporato il routing Camel. È possibile avere questo tipo di routing con la configurazione master-slave? Ora sembra che le rotte Camel vengano avviate e attivate già quando viene avviato ActiveMQ slave e non quando avviene il failover effettivo.Come avviare i percorsi Camel su ActiveMQ slave solo quando lo slave diventa attivo nel failover?

Ora che provoca l'istanza schiavo di ricevere gli stessi messaggi che vengono inviati anche a padroneggiare e questo fa sì che i messaggi duplicati per arrivare alla coda in caso di failover.

sto usando ActiveMQ 5.3 insieme ad Apache Camel 2.1.

risposta

1

questo non dovrebbe essere un problema perché il cammello Contesto/percorsi sul slave non inizieranno fino a diventare il padrone (quando il blocco del file archivio di messaggi viene rilasciato dal master)

3

Purtroppo, quando lo schiavo il broker inizia così anche CamelContext insieme ai percorsi. Tuttavia è possibile raggiungere questo obiettivo nel modo seguente:

Sul camelContext schierato con mediatore di schiavo aggiungere il seguente L'avvio automatico attributo per evitare che i percorsi di avviarsi:

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

... 

</camelContext> 

successivo è necessario creare una classe che implementa il Interfaccia di servizio ActiveMQ. Un esempio di questo potrebbe essere il seguente:

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

Poi, nel file di configurazione del broker, activemq.xml, aggiungere il seguente per registrare il servizio:

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

Ora, una volta che il broker schiavo prende il sopravvento come il master, il metodo start verrà invocato sulla classe di servizio e verranno avviati i percorsi.

ho anche inviato un blog su questo qui: http://jason-sherman.blogspot.com/2012/04/activemq-how-to-startstop-camel-routes.html

Problemi correlati