Apache Camel - CamelContext

CamelContext fornece acesso a todos os outros serviços no Camel, conforme mostrado na figura a seguir -

Vejamos os vários serviços. oRegistrymódulo por padrão é um registro JNDI, que contém o nome dos vários Javabeans que seu aplicativo usa. Se você usar Camel com Spring, esta será a SpringApplicationContext. Se você usar Camel no contêiner OSGI, isso seráOSGI registry. oType converterscomo o nome sugere, contém os vários conversores de tipo carregados, que convertem sua entrada de um formato para outro. Você pode usar os conversores de tipo embutidos ou fornecer seu próprio mecanismo de conversão. oComponentsmódulo contém os componentes usados ​​por seu aplicativo. Os componentes são carregados por descoberta automática noclasspathque você especifica. No caso do container OSGI, estes são carregados sempre que um novo bundle é ativado. Já discutimos oEndpoints e Routesnos capítulos anteriores. oData formats módulo contém os formatos de dados carregados e, finalmente, o Languages módulo representa os idiomas carregados.

O trecho de código aqui lhe dará uma ideia de como um CamelContext é criado em um aplicativo Camel -

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

o DefaultCamelContext classe fornece uma implementação concreta de CamelContext. DentroaddRoutes método, criamos uma instância anônima de RouteBuilder. Você pode criar váriosRouteBuilderinstâncias para definir mais de um roteamento. Cada rota no mesmo contexto deve ter um ID exclusivo. As rotas podem ser adicionadas dinamicamente no tempo de execução. Uma rota com o mesmo ID que a definida anteriormente substituirá a rota mais antiga.

O que se passa dentro do RouteBuilder instância é descrita a seguir.

Rotas

O roteador define a regra para mover a mensagem from para um tolocalização. Você usaRouteBuilderpara definir uma rota em Java DSL. Você cria uma rota estendendo oRouteBuilderclasse. A rota começa com umfromponto final e termina em um ou mais pontos finais. Entre os dois, você implementa a lógica de processamento. Você pode configurar qualquer número de rotas em um únicoconfigure método.

Aqui está um exemplo típico de como a rota é criada -

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

Substituímos o método de configuração de RouteBuilderclasse e implementar nosso mecanismo de roteamento e filtragem nela. No caso atual, redirecionamos a entrada recebida do EndpointDistributeOrderDSL para o console, que é especificado pelo Endpoint stream:out.

Escolha do idioma

Você pode criar as rotas em diferentes idiomas. Aqui estão alguns exemplos de como a mesma rota é definida em três idiomas diferentes -

Java DSL

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

Spring DSL

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

Scala DSL

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

Filtros

Você usa o filtro para selecionar uma parte do conteúdo de entrada. Para configurar um filtro, você usa qualquer implementação de Predicado arbitrária . A entrada filtrada é então enviada para o seu endpoint de destino desejado. Neste exemplo, filtramos todos os pedidos de sabonete para que possam ser enviados coletivamente a um fornecedor de sabonete.

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

No exemplo, usamos xpathpredicado para filtragem. Se você preferir usar a classe Java para filtragem, use o seguinte código -

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

o Order é sua classe Java customizada com seu próprio mecanismo de filtragem.

Você pode combinar vários predicados em um único roteamento como aqui -

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

Portanto, agora todos os pedidos de “óleo” irão para o vendedor de óleo, os pedidos de “leite” irão para o vendedor de leite e o restante para um pool comum.

Processador Personalizado

Você também pode usar o processamento personalizado. O exemplo abaixo cria um processador personalizado chamadomyCustomProcessor e o usa no construtor de rotas.

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

Você pode usar processadores personalizados junto com escolha e filtragem para obter um melhor controle sobre sua mediação e roteamento -

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

Usando XML

As rotas podem ser definidas em XML mais volumoso, se você preferir. O seguinte snippet XML mostra como criar uma rota junto com alguma filtragem 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>

Tendo visto como as rotas são construídas, veremos agora as várias técnicas de criação de Endpoints.