2012-11-16 13 views
10

Ich möchte Camel verwenden, um eine Nachricht von ActiveMQ zu nehmen und dann basierend auf dem Inhalt der Nachricht (ein Protobuf) eine oder mehrere Nachrichten an Twitter zu senden. Ich habe eine Bean geschrieben, die innerhalb einer Route aufgerufen wird und die Injektion verwendet, um mehrere Nachrichten an einen "direct: xyz" -Endpunkt zu senden.Apache Camel Endpunkt-Injektion zur direkten Route "Keine Verbraucher auf dem Endpunkt verfügbar"

jedoch Camel wird zur Laufzeit beschweren, dass:

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] 

Wenn es stattdessen direkt an den Endpunkt Twitter injiziert aus der Bohne, es funktioniert gut. Um das Testen zu vereinfachen, die Konfiguration zu vereinfachen usw., möchte ich die aktuelle Twitter-Konfiguration getrennt halten und möchte daher eine separate Route senden.

Das Kamel Kontext Config wie folgt aussieht: -

Die Bohne wie folgt aussieht: -

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

ich dieses Problem in anderen Routen gehabt haben (es ist sicherlich nicht auf die Twitter-Funktion im Zusammenhang) aber habe gerade darum herum gearbeitet. Diesmal möchte ich aber tatsächlich verstehen, worum es geht! Jede Hilfe dankbar angenommen, danke.

Antwort

5

Es klingt wie ein Problem mit der Startbestellung Ihrer Routen. Weitere Details finden Sie hier http://camel.apache.org/configuring-route-startup-ordering-and-autostartup.html

Sie können die "direkte" Route so konfigurieren, dass sie vor der anderen Route beginnt, dann sollte das Problem gelöst sein.

+0

Danke. Ich habe startupOrder = "100" auf der direkten Route und "200" auf die, die es sendet, und es hat perfekt funktioniert. –

+0

Ich habe vor dem Konfigurieren der Route die Erzeugervorlage und den Kamelkontext gesetzt. Die Reihenfolge ist konfigurieren Route - Kamel Kontext starten - Producer Template Konfiguration –

7

Entsprechend Ihrer Einstellung hängt es möglicherweise auch von der CamelContext ab, die Sie abgeholt haben. Ich habe die gleiche Fehlermeldung erhalten, weil ich Nachrichten auf einer Route gesendet habe, die in einer anderen CamelContext als die existierte, die ich tatsächlich verwendete.

(Obwohl die vorherige Antwort bereits akzeptiert wurde, könnte dies die Arbeitslösung für andere Menschen für diese Fehlermeldung zu suchen.)

+0

Ich hatte ein ähnliches Problem. Ich habe vergessen, der RouteBuilder-Klasse den @Component-Header hinzuzufügen, was bedeutet, dass Spring keine Instanz der Klasse erstellt hat. – Phyxx

0

Für andere kommen hier kann dieser Fehler auch für ein durch einen OSGi Fehler verursacht werden Abhängigkeit, die nicht bereitgestellt wurde.

0

Ein bisschen spät auf die Party, aber dieser Fehler ist mir passiert, als ich zwei separate Blueprint-Dateien hatte, eine für den normalen Betrieb und eine für den Test. In meinem Test habe ich mich auf den Testentwurf bezogen, habe aber bemerkt, dass der normale auch automatisch gestartet wurde, was zu Fehlern führte.

In der Dokumentation http://camel.apache.org/blueprint-testing.html heißt es, dass Sie bestimmte Bundles vom Start deaktivieren können. Das hat mir in meinem Fall geholfen.