Inicialização
Explorando o projeto que foi gerado é possível identificar duas classes Java. A primeira delas, a MainApp, executa a inicialização do projeto criando uma instância de um wrapper de execução fornecido pelo próprio Camel. Esse wrapper facilita a execução do Camel como uma aplicação Java padrão sem a necessidade de runtimes adicionais e é definido na classe org.apache.camel.main.Main
.
Esse wrapper permite uma execução limpa do Camel, sem a necessidade de uso de sleeps, busy spins e outros métodos rudimentares para controlar a execução do Camel.
Nesta classe podemos ver o uso de uma segunda classe auto-gerada, a MyRouteBuilder
. Esta classe, uma especialização da classe abstrata org.apache.camel.builder.RouteBuilder
é utilizada para configurar a rota utilizada pelo programa.
Ela é adicionada as propriedades de configuração do wrapper, o que é feito através dos métodos encadeados configure().addRoutesBuilder()
, para que seja possível executa-la quando o programar rodar.
A configuração da rota dentro do método configure na classe MyRouteBuilder
provê uma rota bastante simples mas que apresenta diversos conceitos importantes do Camel. De modo geral, a rota copia arquivos de um diretório para outro baseado no seu conteúdo. A rota do projeto de exemplo é a seguinte:
from("file:src/data?noop=true")
.choice()
.when(xpath("/person/city = 'London'"))
.log("UK message")
.to("file:target/messages/uk")
.otherwise()
.log("Other message")
.to("file:target/messages/others");
Avaliando linha a linha a definição desta rota, temos o seguinte:
from("file:src/data?noop=true")
Um endpoint inicial from é declarado usando o componente file
, utilizado para ler, monitorar arquivos e diretórios em disco, usando como entrada o diretório src/data
que é parte da estrutura de diretórios do projeto recém criado. O componente é configurado com a opção noop
, para evitar que os arquivos sejam movidos ou removidos do diretório.
Na linha seguinte, o código utiliza o método choice da DSL para aplicar uma condição na rota e definir que os dados devem seguir um rumo ou outro de acordo com uma expressão xpath.
.choice()
.when(xpath("/person/city = ‘London’"))
// … código
.otherwise()
// … código
Dependendo do resultado dessa expressão mostra uma mensagem de log e copia o arquivo para diretórios diferentes. O código usa o método log
para acessar o logger configurado como parte da configuração inicial do projeto e definido no arquivo log4j.properties
. Em seguida, define os terminadores da rota usando o método to
. O terminador usa, novamente, o componente file
para definir o diretório onde os arquivos serão salvos (target/messages/uk
caso a expressão xpath resulte em verdadeiro ou target/messages/others
caso contrário).