Aprendendo Camel: Nossa Primeira Rota

Vamos por a mão na massa, todo código pode ser clonado no repositório do aprendendo java. Você pode ver a introdução que fiz para a série Aprendendo Camel: Intodução.

Bom, vamos configurar nossa primeira rota, ele será responsável por ficar escutando uma pasta com alguns arquivos xml com contatos, e depois move-los para dentro das pastas de acordo com o tipo de contato.

Mas antes temos que criar um enum para armazenar os tipos de contato. Para isso, vamos criar o Enum TipoContato. Dentro do package: br.com.aprendendo.camel.constants:

package br.com.aprendendo.camel.constants;

public enum TipoContato {
    
    TRABALHO, ESCOLA, FAMILIA, OUTROS;

}

Isso é bem simples, agora vamos configurar a rota, dentro do package br.com.aprendendo.camel.routes, crie a classe: SimpleRoute, estenda RouteBuilder e anote ela com @ContextName. Com isso falamos para o camel que essa é uma rota e deve estar presente na sua listagem de rotas. Ficará algo como:

@ContextName
public class SimpleRoute extends RouteBuilder {}

O eclipse vai reclamar de algo, isso porque falta implementar o método da classe RouteBuilder que acabamos de estender. No final ficará algo como:

@ContextName
public class SimpleRoute extends RouteBuilder {
    
  @Override
  public void configure() throws Exception {
    
  }

}

Chic show mano, agora vamos criar as constantes onde ficarão os arquivos e para onde devem ser movidos, dentro da classe, mas fora do método, cole o seguinte trecho;

final String CAMINHO_PROPERTIES_ENTRADA = "/data/entrada/";
final String CAMINHO_PROPERTIES_SAIDA = "/data/contatos/";

final String CAMINHO_REAL_ENTRADA = getClass().getResource(CAMINHO_PROPERTIES_ENTRADA).getPath();
final String CAMINHO_REAL_SAIDA = getClass().getResource(CAMINHO_PROPERTIES_SAIDA).getPath();

Agora dentro do método vamos editar os endpoints (from() e to()), e o component file, para mover os arquivos. Teremos também as condições para mover os arquivos para isso faremos a orquestração usando choice() e when() para as condições o xpath() para navegar dentro do arquivo xml.

from("file:" + CAMINHO_REAL_ENTRADA + "?delay=5s")
        .log(LoggingLevel.INFO, "Movendo arquivo: ${file:name}")
        .choice()
            .when()
                .xpath("/person/tipoContato[text() = '" + TipoContato.ESCOLA.name() + "']")
                .to("file:" + CAMINHO_REAL_SAIDA + TipoContato.ESCOLA.name())
            .when()
                .xpath("/person/tipoContato[text() = '" + TipoContato.FAMILIA.name() + "']")
                .to("file:" + CAMINHO_REAL_SAIDA + TipoContato.FAMILIA.name())
            .when()
                .xpath("/person/tipoContato[text() = '" + TipoContato.TRABALHO.name() + "']")
                .to("file:" + CAMINHO_REAL_SAIDA + TipoContato.TRABALHO.name())
            .when()
                .xpath("/person/tipoContato[text() = '" + TipoContato.OUTROS.name() + "']")
                .to("file:" + CAMINHO_REAL_SAIDA + TipoContato.OUTROS.name())
        .end();

Legal, vamos explicar o que cada coisa faz:

  • from(“file:” + CAMINHO_REAL_ENTRADA + “?delay=5s”): Lê a pasta de entrada, com um delay de 5 segundos;
  • .log(LoggingLevel.INFO, “Movendo arquivo: ${file:name}”): Faz o log e pega o file name usando a file language;
  • .choice() e .when(): para as condições;
  • .xpath(“/person/tipoContato[text() = ‘” + TipoContato.ESCOLA.name() + “‘]”): Para navegar dentro das tags do xml que logo vamos criar. Ali pegamos apenas os person com tipo de contato Escola;
  • .to(“file:” + CAMINHO_REAL_SAIDA + TipoContato.ESCOLA.name()): Por fim, movemos para a pasta de saída, com o nome do tipo do contato.

OBS, os outros campos, se assemelham ao último. Cada tipo de contato vai enviar para uma pasta.

Agora crie, a seguinte estrutura dentro de src/main/resources:

Captura de Tela 2015-11-15 às 19.42.51

Por fim, dentro da pasta entrada, crie os seguintes arquivos xml:

  • contato_01.xml
<?xml version="1.0" encoding="UTF-8"?>
<person user="pedro">
  <firstName>Pedro</firstName>
  <lastName>Silva</lastName>
  <city>São José dos Campos</city>
  <tipoContato>FAMILIA</tipoContato>
</person>
  • contato_02.xml
<?xml version="1.0" encoding="UTF-8"?>
<person user="tais">
  <firstName>Taís</firstName>
  <lastName>Monique</lastName>
  <city>São Paulo</city>
  <tipoContato>TRABALHO</tipoContato>
</person>
  • contato_03.xml
<?xml version="1.0" encoding="UTF-8"?>
<person user="william">
  <firstName>William</firstName>
  <lastName>Siqueira</lastName>
  <city>Santo Antônio do Pinhal</city>
  <tipoContato>OUTROS</tipoContato>
</person>
  • contato_04.xml
<?xml version="1.0" encoding="UTF-8"?>
<person user="jose">
  <firstName>José</firstName>
  <lastName>Paulo</lastName>
  <city>Brusque</city>
  <tipoContato>ESCOLA</tipoContato>
</person>

Observe, que o xml, possui vários campos, mas para a aplicação a que mais importa é a <tipoContato>, que é a mesma que usamos no xpath().

Feito isso basta iniciar a aplicação e no log, deve aparecer algo como:

Captura de Tela 2015-11-15 às 19.51.26

Para ver os arquivos movidos, acesse: [local_instalação_wildfly]/standalone/deployments/camel-cdi-exemplo.war/WEB-INF/classes/data/contatos

Ali você verá as pastas, ao entrar em cada uma verá que contém um arquivo específico de acordo com o tipo do contato.

Era isso meu povo, até a próxima \o

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s