Apache Camel - Usando com Spring

Agora vamos recriar o aplicativo do capítulo anterior usando Spring. Isso nos dará uma ideia de como criar o roteamento Camel em XML em vez de DSL.

Criando Novo Projeto

Crie um novo Maven projeto e especifique o seguinte -

GroupId: BasketWithSpring
ArtifactId: BasketWithSpring

Selecione o local padrão para o seu projeto ou, se preferir, especifique o diretório de sua escolha.

Adicionando Dependências

Além das dependências principais que você usou no aplicativo anterior, você precisa adicionar mais algumas dependências para usar o Spring. As dependências são adicionadas em pom.xml. Agora, abra pom.xml e adicione as seguintes dependências -

<dependencies>
   ...
   <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.1.3.RELEASE</version>
   </dependency>
   
   <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-pool</artifactId>
      <version>5.15.2</version>
   </dependency>
   
   <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-pool</artifactId>
      <version>5.15.1</version>
   </dependency>
   
   <dependency>
      <groupId>org.apache.camel</groupId>
      <artifactId>camel-spring</artifactId>
      <version>2.15.1</version>
   </dependency>
</dependencies>

Criação de Java DSL para Spring

Vamos agora criar uma nova classe Java chamada DistributeOrderXML. Adicione o seguinte código a ele -

public class DistributeOrderXML {
   public static void main(String[] args) throws Exception {
      ApplicationContext appContext = new ClassPathXmlApplicationContext(
         "SpringRouteContext.xml");
      CamelContext camelContext = SpringCamelContext.springCamelContext(appContext, false);
      try {
         camelContext.start();
         ProducerTemplate orderProducerTemplate = camelContext.createProducerTemplate();
         InputStream orderInputStream = new FileInputStream(ClassLoader.getSystemClassLoader()
            .getResource("order.xml").getFile());
         
         orderProducerTemplate.sendBody("direct:DistributeOrderXML", orderInputStream);
      } finally {
         camelContext.stop();
      }
   }
}

No main método, primeiro criamos uma instância de ApplicationContext, que é a interface central em um aplicativo Spring. Em seu construtor, especificamos o nome do arquivo XML que contém nossas informações de roteamento e filtragem.

ApplicationContext appContext = new ClassPathXmlApplicationContext(
   "SpringRouteContext.xml");

Em seguida, criamos CamelContext especificando o criado acima ApplicationContext em seu parâmetro.

CamelContext camelContext = SpringCamelContext.springCamelContext(appContext, false);

Neste ponto, nosso roteamento e filtragem estão configurados. Portanto, começamos oCamelContext usando seu startmétodo. Como no caso anterior, definimos o Endpoint para carregar o arquivo order.xml e iniciar o processamento. Agora, vamos entender como o roteamento é definido em XML.

Criando o contexto do aplicativo

Adicione um novo arquivo XML ao projeto e chame-o SpringRouteContext.xml. Recorte e cole o seguinte conteúdo neste arquivo.

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://camel.apache.org/schema/spring
      http://camel.apache.org/schema/spring/camel-spring.xsd ">
   <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>
</beans>

Aqui, definimos a consulta xpath da seguinte forma, observe que agora selecionamos todos os pedidos de “óleo”.

<xpath>//order[@product = 'Oil']/items</xpath>

Os pontos de extremidade de saída são múltiplos. O primeiro endpoint especifica oorder pasta e a segunda especifica o console.

<to uri = "file:src/main/resources/order/"/>
<to uri = "stream:out"/>

Execute o aplicativo.

Resultado dos testes

Ao executar o aplicativo, você verá a seguinte saída na tela.

<items>
   <item>
      <Brand>Cinthol</Brand>
      <Type>Original</Type>
      <Quantity>4</Quantity>
      <Price>25</Price>
   </item>
   <item>
      <Brand>Cinthol</Brand>
      <Type>Lime</Type>
      <Quantity>6</Quantity>
      <Price>30</Price>
   </item>
</items>

Confira o orderpasta no caminho especificado por você. Você encontrará um arquivo recém-criado que contém o código XML acima.

Conclusão

Camel fornece uma estrutura pronta para uso que implementa EIPs para facilitar seus projetos de integração. Ele oferece suporte à codificação em linguagens de domínio específico e também ao uso de XML.