2012-11-16 18 views
10

Desidero utilizzare Camel per ricevere un messaggio da ActiveMQ e quindi, in base al contenuto del messaggio (un protobuf), inviare uno o più messaggi a Twitter. Ho scritto un bean chiamato da una route e che utilizza l'injection per inviare più messaggi a un endpoint "direct: xyz".Apache Camel Endpoint iniezione per dirigere il percorso "Nessun utente disponibile sull'endpoint"

Tuttavia, Camel si lamenta in fase di esecuzione che:

2012-11-16 09:56:33,376 | WARN | ication.twitter] | DirectProducer     | 160 - org.apache.camel.camel-core - 2.10.2 | No consumers available on endpoint: Endpoint[direct://twitter] to process: Exchange[Message: hello world] 

Se invece iniettare direttamente al punto finale Twitter all'interno del chicco, funziona benissimo. Tuttavia, per facilitare i test, semplificare la configurazione, ecc., Vorrei mantenere separata la configurazione attuale di Twitter, quindi voglio inviare a un percorso separato.

La configurazione contesto cammello si presenta come: -

Il fagiolo si presenta come: -

public class NotificationTweeter { 

    @EndpointInject(uri = "direct:twitter") 
    private ProducerTemplate producerTemplate; 

    public void createTweets(NotificationMsg notification) { 

    String tweet = notification.getMessageDetail().getTitle(); 

    try { 
     // only send tweets where the notification message contains the Twitter mechanism 
     for (MechanismMsg mechanism : notification.getMechanismList()) { 
     if (mechanism.getType() == MechanismTypeEnum.TWITTER) { 

      // Cycle round the recipients 
      for (RecipientMsg recipient : mechanism.getRecipientList()) { 
      tweet = "@" + recipient.getIdentifier() + " " + tweet; 

      producerTemplate.sendBody(tweet); 
      } 

      // TODO exceptions if no recipients found, etc 
     } 
     } 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    } 
} 

Ho avuto questo problema in altri percorsi (non è certamente legato alla funzione di Twitter) ma hanno appena lavorato intorno ad esso. Questa volta, tuttavia, mi piacerebbe davvero capire qual è il problema! Qualsiasi aiuto ricevuto con gratitudine, grazie.

risposta

5

Sembra un problema con l'ordine di avvio dei percorsi. Vedi ulteriori dettagli qui http://camel.apache.org/configuring-route-startup-ordering-and-autostartup.html

È possibile configurare il percorso "diretto" per l'avvio prima dell'altro percorso, quindi il problema deve essere risolto.

+0

Grazie. Ho aggiunto startupOrder = "100" al percorso diretto e "200" a quello che gli ho inviato e ha funzionato perfettamente. –

+0

Stavo impostando il modello del produttore e iniziando il contesto del cammello prima di configurare il percorso. L'ordine è configurato come percorso - avvio contesto cammello - Configurazione modello produttore –

7

In base alla configurazione, potrebbe dipendere anche dallo CamelContext che hai raccolto. Ho ricevuto lo stesso messaggio di errore perché stavo inviando messaggi su un percorso che esisteva in un altro CamelContext rispetto a quello che stavo effettivamente usando.

(Anche se la risposta precedente è stato già accettato, questa potrebbe essere la soluzione di lavoro per le altre persone alla ricerca di quel messaggio di errore.)

+0

Ho avuto un problema simile. Ho dimenticato di aggiungere l'intestazione @Component alla classe RouteBuilder, il che significava che Spring non stava creando un'istanza della classe. – Phyxx

0

Per gli altri a venire qui, questo errore può anche essere causato da un errore di OSGi per un dipendenza che non è stata distribuita.

0

Un po 'tardi alla festa ma questo errore mi è successo quando avevo due file di progetto separati, uno per la normale e uno per la prova. Nel mio test mi riferivo al progetto di prova, ma ho notato che anche quello normale è stato avviato automaticamente, causando errori.

Nella documentazione http://camel.apache.org/blueprint-testing.html si dice che è possibile disabilitare determinati pacchetti all'avvio. Questo mi ha aiutato nel mio caso.