2015-09-03 11 views
5

Wie in Apache Camel erwähnt, ermöglicht es dynamische URI in To() schreiben, ermöglicht es dynamische URI in From() zu schreiben. Ursache Ich muss die mehreren FTP-Standorte aufrufen, um die Dateien auf der Basis der Konfiguration herunterzuladen, die ich in der Datenbank speichern werde.So verwenden Sie einen dynamischen URI in From()

Ich werde diese Konfiguration aus der DB lesen und werde sie zur Laufzeit dynamisch an die Camel-Route übergeben.

Beispiel: Dies ist das Kamel Route Beispiel, dass ich dynamisch

<Route> 
    <from uri="ftp://${ftpUser}@${ftpHost}:${ftpPort}/${FTPSourceDir}?password=${ftpPassword}&delete=true"/> 
    <to uri="${ftpDestinationDir}"/> 
</Route> 

zu schreiben haben, wie Sie in Beispiel sehen, ich brauche dynamisch diese genannten Parameter zu übergeben. So wie dynamische uri in der Verwendung von()

Antwort

5

Sie es von Immobilien Datei lesen können wie folgt

<bean id="bridgePropertyPlaceholder" class="org.apache.camel.spring.spi.BridgePropertyPlaceholderConfigurer"> 
    <property name="location" value="classpath:/config/Test.properties"/> 
    </bean> 

<Route> 
    <from uri="ftp://{{ftpUser})@${{ftpHost}}:{{ftpPort}}/${{FTPSourceDir}}?password={{ftpPassword}}&delete=true"/> 
    <to uri="{{ftpDestinationDir}}"/> 
</Route> 

ftpUser, FTPHOST .... - alle sind die Schlüssel in Test.properties erklärt

Wenn Sie diese Variablen dynamisch von Ihrem Exchange abrufen möchten, können Sie dies nicht wie in Ihrem Beispiel beschrieben tun. Sie müssen Verbraucher Vorlage wie folgt verwenden,

Sie müssen dies von einem Frühjahr Bohnen oder Kamel Hersteller tun. Die Consumer-Vorlage verwendet die angegebene Komponente und diese Producer-Vorlage ruft die in Ihrer camel-context.xml deklarierte direkte Komponente auf.

Hinweis: Consumer- und Producer-Vorlagen sind etwas teuer. Sie können beide in Frühlingsbehälter einspritzen und lassen die Feder den Lebenszyklus behandeln.

+0

Lets sagen, dass ich 3 ftp-Server haben, wie kann ich jeden Server nacheinander auf einer Strecke passieren? – hipokito

0

Ich denke, dass Sie Ihre Anforderung innerhalb einer Camel-Route implementieren können.

Da Sie mehrere FTP-Sites abfragen möchten, müssen Sie diesen Prozess irgendwie auslösen. Vielleicht könnten Sie dies auf Basis eines Quartz2 Timers tun. Nach dem Auslösen können Sie die konfigurierten FTP-Sites from your database lesen.

Um die angegebenen FTP-Sites abzufragen, können Sie die Content Enricher pattern verwenden, um eine dynamisch ausgewertete URI abzufragen (siehe: pollEnrich).

Ihre letzte Basisroute so etwas wie dieser (Pseudo-Code) aussehen:

from("quarz...") 
to("sql...") 
pollEnrich("ftp...") 
... 
1

ich ein Team helfen, die einen Nachrichten-Broker arbeitet über eine Million Nachricht pro Tag wechseln. Es gibt über 50 Ziele, von denen wir Dateien über alle File-Sharing-Marken abfragen müssen (FTP, SFTP, NFS/Datei: ...). Die Verwaltung von bis zu 50 Bereitstellungen, die jeweils auf ein anderes lokales/entferntes Verzeichnis warten, ist in der Tat ein Overhead im Vergleich zu einem einzelnen FILE-Konnektor, der Dateien an den 50 Stellen gemäß dem spezifischen Zeitplan und den Sicherheitseinstellungen von jedem abrufen kann E-Mail von Pop3- und IMAP-Mailboxen.

In Kamel, ist der Umriss einer Lösung wie folgt:

  • haben Sie keine andere Wahl, als verwenden, um die java DSL mit einem URI zumindest die aus() Teil Ihrer Routen zu konfigurieren, dass Sie kann in der Tat lesen/erstellen von einer Datenbank oder erhalten von einer Admin-Anfrage, um eine neue Route zu initiieren. Die XML-DSL erlaubt nur injecting properties, die einmal aufgelöst werden, wenn der Camel-Kontext erstellt wird und nie wieder danach.
  • die Grundidee ist Routen, lassen Sie sie laufen (hören oder abfragen, eine genaue Ressource) zu starten, und dann & Shutdown sie bei Bedarf wieder aufbauen mit dem Camel Kontext APIs, die den Zustand von RouteDefinitions zu verwalten, Routen und möglicherweise Endpunkte
  • persönlich, ich möchte solche dynamische von() Instanziierung auf minimalistischen Routen mit nur der 'von' Teil der Route, dh from(uri).to("direct:inboundQueue").routeId("myRoute") implementieren, und dann definieren - in Java oder XML - eine gemeinsame Route Chunk behandelt den Rest des Prozesses: from("direct:inboundQueue").process(..).etc... .to(outUri)
  • Ich werde stark beraten zu kombinieren Camel mit dem Spring-Framework, und insbesondere Spring MVC (oder Spring Integration HttpGateway), so dass Sie die Möglichkeit schnell zu bauen REST, SOAP, HTTP/JSP oder JMX Bean-Schnittstellen zur Verwaltung der Route Erstellung, Zerstörung und Updates innerhalb eines Spring + Camel Containers, beide nicely integrated.
  • Sie können dann im Spring-Anwendungskontext eine Bean deklarieren, die SpringRouteBuilder erweitert, wie üblich beim Erstellen von Camel-Routen mit der java DSL in Spring; in der obligatorischen @Override configure() Methodenimplementierung wird Sie Ihr routeDefinition Objekt gebaut von der from(uri) Methode speichern, und weisen Sie ihm eine bekannte StringRoute-id mit dem .routeId(route-id) Verfahren; Sie können zum Beispiel die Routen-ID als Schlüssel in einer Karte Ihrer bereits erstellten und gestarteten Routen-Definitionsobjekte sowie einen Schlüssel in Ihrem DB der URIs verwenden.
  • dann erweitern Sie die SpringRouteBuilder bean Sie mit neuen Methoden createRoute (route-id), updateRoute (Route-id) und removeRoute (Route-id) erklärt haben; Die zugehörigen Route-ID-Parameter, die für die Erstellung oder Aktualisierung benötigt werden, werden von der Datenbank oder einer anderen Registrierung abgerufen, und die relevante Methode, die innerhalb der RouteBuilder-Bean ausgeführt wird, nutzt die getContext()-Funktion zum Abrufen der aktuellen ModelCamelContext, die wiederum verwendet wird zu stopRoute(route-id), removeRoute(route-id) und dann addRouteDefinition(hier ist, wo Sie das routeDefinition Objekt brauchen ) und schließlich startRoute(route-id) (Hinweis: Vorsicht vor möglichen Geistern Endpunkte, die nicht entfernt werden würde, wie in den removeRoute() javadoc erklärt)
  • Ihre Schnittstelle zur Administration (die in der Regel die Form einer Spring @Controller-Komponente/-Bohne hat, die den HTTP/REST/SOAP-Datenverkehr verarbeitet) wird in der Tat eine einfache Aufgabe haben die zuvor erstellte SpringRouteBuilder Erweiterung Bean von Spring injiziert in der Controller-Bean, und damit Zugriff auf alle notwendigen createRoute(route-id), updateRoute(route-id) und removeRoute(route-id) Methoden, die Sie hinzugefügt haben, um die SpringRouteBuilder Erweiterung Bean.

Und das funktioniert gut. Die genaue Implementierung mit all dem Fehlerbehandlungs- und Validierungscode, der zutrifft, ist ein bisschen zu viel Code, der hier gepostet werden muss, aber Sie haben alle Links zu den relevanten Anleitungen, wie oben beschrieben.

4

Von Kamel 2,16 auf-wärts, wir pollenrich Komponente verwenden können Polling Verbraucher wie Datei, ftp..etc mit dynamischer URL/Parameterwert wie unten

<route> 
    <from uri="direct:start"/> 
    <pollEnrich> 
    <simple>file:inbox?fileName=${body.fileName}</simple> 
    </pollEnrich> 
    <to uri="direct:result"/> 
</route> 

Sein awesomeeee zu definieren !!!

Siehe: http://camel.apache.org/content-enricher.html

0
Use Camel endpoint with spring spel expression. 

Set up a Camel endpoint in the context so it can be accessed from any bean: 

     <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> 
      <endpoint id="inventoryQueue" uri="#{config.jms.inventoryQueueFromUri}"/> 
     </camelContext> 

Now you can reference the inventoryQueue endpoint within the `@Consume` annotation as follows: 
     @org.apache.camel.Consume(ref = "inventoryQueue") 
     public void updateInventory(Inventory inventory) { 
      // update 
     } 

    Or: 
    <route> 
     <from ref="inventoryQueue"/> 
     <to uri="jms:incomingOrders"/> 
    </route> 
Verwandte Themen