Apache Camel - CamelContext

CamelContext donne accès à tous les autres services de Camel comme indiqué dans la figure suivante -

Regardons les différents services. leRegistrymodule par défaut est un registre JNDI, qui contient le nom des différents Javabeans que votre application utilise. Si vous utilisez Camel avec Spring, ce sera le printempsApplicationContext. Si vous utilisez Camel dans un conteneur OSGI, ce seraOSGI registry. leType converterscomme son nom l'indique, contient les différents convertisseurs de type chargés, qui convertissent votre entrée d'un format à un autre. Vous pouvez utiliser les convertisseurs de type intégrés ou fournir votre propre mécanisme de conversion. leComponentsmodule contient les composants utilisés par votre application. Les composants sont chargés par détection automatique sur leclasspathque vous spécifiez. Dans le cas du conteneur OSGI, ceux-ci sont chargés chaque fois qu'un nouveau bundle est activé. Nous avons déjà discuté de laEndpoints et Routesdans les chapitres précédents. leData formats le module contient les formats de données chargés et enfin le Languages module représente les langues chargées.

L'extrait de code ici vous donnera un aperçu de la façon dont un CamelContext est créé dans une application Camel -

CamelContext context = new DefaultCamelContext();
try {
   context.addRoutes(new RouteBuilder() {
      // Configure filters and routes
   }
}
);

le DefaultCamelContext class fournit une implémentation concrète de CamelContext. DansaddRoutes méthode, nous créons une instance anonyme de RouteBuilder. Vous pouvez créer plusieursRouteBuilderinstances pour définir plus d'un routage. Chaque route dans le même contexte doit avoir un ID unique. Les itinéraires peuvent être ajoutés dynamiquement au moment de l'exécution. Un itinéraire avec le même ID que celui précédemment défini remplacera l'ancien itinéraire.

Ce qui se passe à l'intérieur RouteBuilder l'instance est décrite ci-après.

Itinéraires

Le routeur définit la règle de déplacement du message from à un toemplacement. Tu utilisesRouteBuilderpour définir une route dans Java DSL. Vous créez un itinéraire en étendant leRouteBuilderclasse. L'itinéraire commence par unfrompoint final et se termine à un ou plusieurs points finaux. Entre les deux, vous implémentez la logique de traitement. Vous pouvez configurer n'importe quel nombre d'itinéraires dans un mêmeconfigure méthode.

Voici un exemple typique de la façon dont l'itinéraire est créé -

context.addRoutes(new RouteBuilder() {
   @Override
   public void configure() throws Exception {
      from("direct:DistributeOrderDSL")
      .to("stream:out");
   }
}

Nous remplaçons la méthode de configuration de RouteBuilderclasse et implémentez notre mécanisme de routage et de filtrage. Dans le cas actuel, nous redirigeons les entrées reçues du EndpointDistributeOrderDSL à la console, qui est spécifiée par le point de terminaison stream:out.

Choix de la langue

Vous pouvez créer les itinéraires dans différentes langues. Voici quelques exemples de la façon dont le même itinéraire est défini dans trois langues différentes -

Java DSL

from ("file:/order").to("jms:orderQueue");

DSL de printemps

<route>
   <from uri = "file:/order"/>
   <to uri = "jms:orderQueue"/>
</route>

Scala DSL

from "file:/order" -> "jms:orderQueue"

Filtres

Vous utilisez le filtre pour sélectionner une partie du contenu d'entrée. Pour configurer un filtre, vous utilisez n'importe quelle implémentation arbitraire de Predicate . L'entrée filtrée est ensuite envoyée à votre point de terminaison de destination souhaité. Dans cet exemple, nous filtrons toutes les commandes de savon afin que celles-ci puissent être envoyées collectivement à un fournisseur de savon.

from("direct:DistributeOrderDSL")
   .split(xpath("//order[@product = 'soaps']/items"))
      .to("stream:out");

Dans l'exemple, nous avons utilisé xpathprédicat pour le filtrage. Si vous préférez utiliser la classe Java pour le filtrage, utilisez le code suivant -

from("direct:DistributeOrderDSL")
   .filter()
      .method(new Order(),"filter")
         .to("stream:out");

le Order est votre classe Java personnalisée avec votre propre mécanisme de filtrage.

Vous pouvez combiner plusieurs prédicats dans un seul routage comme ici -

from("direct:DistributeOrderDSL")
   .choice()
      .when(header("order").isEqualTo("oil"))
         .to("direct:oil")
      .when(header("order").isEqualTo("milk"))
         .to("direct:milk")
      .otherwise()
         .to("direct:d");

Alors maintenant, toutes les commandes de «pétrole» iront au vendeur de pétrole, les commandes de «lait» iront au vendeur de lait et le reste à un pool commun.

Processeur personnalisé

Vous pouvez également utiliser un traitement personnalisé. L'exemple ci-dessous crée un processeur personnalisé appelémyCustomProcessor et l'utilise dans le générateur d'itinéraire.

Processor myCustomProcessor = new Processor() {
   public void process(Exchange exchange) {
      // implement your custom processing
   }
};
RouteBuilder builder = new RouteBuilder() {
   public void configure() {
      from("direct:DistributeOrderDSL")
      .process(myProcessor);
   }
};

Vous pouvez utiliser des processeurs personnalisés avec le choix et le filtrage pour obtenir un meilleur contrôle sur votre médiation et votre routage -

from("direct:DistributeOrderDSL")
   .filter(header("order").isEqualTo("milk"))
      .process(myProcessor);

Utilisation de XML

Les routes peuvent être définies en XML plus volumineux, si vous le préférez. L'extrait de code XML suivant montre comment créer une route avec un filtrage via Spring XML -

<camelContext xmlns = "http://camel.apache.org/schema/spring">
   <route>
      <from uri = "direct:DistributeOrderXML"/>
      <log message = "Split by Distribute Order"/>
      <split>
         <xpath>//order[@product = 'Oil']/items</xpath>
         <to uri = "file:src/main/resources/order/"/>
         <to uri = "stream:out"/>
      </split>
   </route>
</camelContext>

Après avoir vu comment les routes sont construites, nous allons maintenant voir les différentes techniques de création de points de terminaison.