Introdução ao Apache Camel
1. Visão geral
Neste artigo, vamosintroduce Camel and explore one of its core concepts – message routing.
Começaremos cobrindo esses conceitos básicos e terminologia e, em seguida, apresentaremos duas opções principais para definir rotas - Java DSL e Spring DSL.
Também vamos demonstrar isso em um exemplo - definindo uma rota que consome arquivos de uma pasta e os move para outra, enquantoprepending é um carimbo de data / hora para cada nome de arquivo.
2. Sobre o Apache Camel
Apache Camel é uma estrutura de integração de software livre projetada para tornar a integração de sistemas simples e fácil.
Ele permite que os usuários finais integrem vários sistemas usando a mesma API, fornecendo suporte para vários protocolos e tipos de dados, sendo extensíveis e permitindo a introdução de protocolos personalizados.
3. Dependências do Maven
Para usar o Camel, precisamos primeiro adicionar a dependência do Maven:
org.apache.camel
camel-core
2.18.0
A versão mais recente do artefato Camel pode ser encontradahere.
3. Idioma específico do domínio
Rotas e mecanismo de roteamento são a parte central do Camel. As rotas contêm o fluxo e a lógica da integração entre diferentes sistemas.
Para definir rotas mais fáceis e limpas, o Camel oferece várias linguagens específicas de domínio (DSL) diferentes para linguagens de programação como Java ou Groovy. Por outro lado, também fornece rotas de definição em XML com o Spring DSL.
O uso do Java DSL ou Spring DSL é principalmente a preferência do usuário, pois a maioria dos recursos está disponível em ambos.
O Java DSL oferece um pouco mais de recursos que não são suportados no Spring DSL. No entanto, o Spring DSL às vezes é mais benéfico, pois o XML pode ser alterado sem a necessidade de recompilar o código.
4. Terminologia e Arquitetura
Vamos agora discutir a terminologia e arquitetura básicas do Camel.
Primeiro, vamos dar uma olhada nos conceitos básicos do Camel aqui:
-
Message contém dados que estão sendo transferidos para uma rota. Cada mensagem possui um identificador único e é construída com um corpo, cabeçalhos e anexos
-
Exchange é o contêiner de uma mensagem e é criado quando uma mensagem é recebida por um consumidor durante o processo de roteamento. O Exchange permite diferentes tipos de interação entre sistemas - ele pode definir uma mensagem unidirecional ou uma mensagem de solicitação-resposta
-
Endpoint é um canal por meio do qual o sistema pode receber ou enviar uma mensagem. Pode se referir a um URI de serviço web, URI de fila, arquivo, endereço de email, etc.
-
Component atua como uma fábrica de endpoint. Simplificando, os componentes oferecem uma interface para diferentes tecnologias usando a mesma abordagem e sintaxe. Camel já suportaa lot of components em suas DSLs para quase todas as tecnologias possíveis, mas também oferece a capacidade de escrever componentes personalizados
-
Processor é uma interface Java simples usada para adicionar lógica de integração personalizada a uma rota. Ele contém um único métodoprocess usado para realizar a lógica de negócios personalizada em uma mensagem recebida por um consumidor
Em um nível alto, a arquitetura do Camel é simples. CamelContext representa o sistema de tempo de execução Camel e conecta diferentes conceitos, como rotas, componentes ou terminais.
E abaixo disso, os processadores lidam com roteamento e transformações entre terminais, enquanto os terminais integram sistemas diferentes.
5. Definindo uma rota
As rotas podem ser definidas com Java DSL ou Spring DSL.
Ilustraremos os dois estilos definindo uma rota que consome arquivos de uma pasta e os move para outra pasta, enquantoprepending um carimbo de data / hora para cada nome de arquivo.
5.1. Roteamento com Java DSL
Para definir uma rota com Java DSL, primeiro precisamos criar uma instânciaDefaultCamelContext. Depois disso, precisamos estender a classeRouteBuilder e implementar o métodoconfigure que conterá o fluxo da rota:
private static final long DURATION_MILIS = 10000;
private static final String SOURCE_FOLDER = "src/test/source-folder";
private static final String DESTINATION_FOLDER
= "src/test/destination-folder";
@Test
public void moveFolderContentJavaDSLTest() throws Exception {
CamelContext camelContext = new DefaultCamelContext();
camelContext.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("file://" + SOURCE_FOLDER + "?delete=true").process(
new FileProcessor()).to("file://" + DESTINATION_FOLDER);
}
});
camelContext.start();
Thread.sleep(DURATION_MILIS);
camelContext.stop();
}
O métodoconfigure pode ser lido assim: ler arquivos da pasta de origem, processá-los comFileProcessore enviar o resultado para uma pasta de destino. Definirdelete=true significa que o arquivo será excluído da pasta de origem após ser processado com êxito.
Para iniciar o Camel, precisamos chamar o métodostart emCamelContext. Thread.sleep é invocado para dar ao Camel o tempo necessário para mover os arquivos de uma pasta para outra.
FileProcessor implementa a interfaceProcessor e contém o métodoprocess único que contém lógica para modificar nomes de arquivo:
public class FileProcessor implements Processor {
public void process(Exchange exchange) throws Exception {
String originalFileName = (String) exchange.getIn().getHeader(
Exchange.FILE_NAME, String.class);
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat(
"yyyy-MM-dd HH-mm-ss");
String changedFileName = dateFormat.format(date) + originalFileName;
exchange.getIn().setHeader(Exchange.FILE_NAME, changedFileName);
}
}
Para recuperar o nome do arquivo, precisamos recuperar uma mensagem recebida de uma central e acessar seu cabeçalho. Semelhante a isso, para modificar o nome do arquivo, precisamos atualizar o cabeçalho da mensagem.
5.2. Roteamento com Spring DSL
Ao definir uma rota com o Spring DSL, usamos um arquivo XML para configurar nossas rotas e processadores. Isso nos permite configurar rotas sem código usando Spring e, finalmente, nos oferece o benefício da inversão total de controle.
Isso já foi abordado emexisting article, então vamos nos concentrar no uso de Spring DSL junto com Java DSL, que normalmente é uma maneira preferida de definir rotas.
Nesse arranjo, o CamelContext é definido no arquivo XML Spring usando a sintaxe XML personalizada do Camel, mas sem a definição de rota, como no caso do DSL Spring "puro" usando XML:
Desta forma, dizemos a Camel para usar a classeFileRouter que contém a definição de nossa rota em Java DSL:
public class FileRouter extends RouteBuilder {
private static final String SOURCE_FOLDER =
"src/test/source-folder";
private static final String DESTINATION_FOLDER =
"src/test/destination-folder";
@Override
public void configure() throws Exception {
from("file://" + SOURCE_FOLDER + "?delete=true").process(
new FileProcessor()).to("file://" + DESTINATION_FOLDER);
}
}
Para testar isso, temos que criar uma instância deClassPathXmlApplicationContext que carregará nossoCamelContext no Spring:
@Test
public void moveFolderContentSpringDSLTest() throws InterruptedException {
ClassPathXmlApplicationContext applicationContext =
new ClassPathXmlApplicationContext("camel-context.xml");
Thread.sleep(DURATION_MILIS);
applicationContext.close();
}
Ao usar essa abordagem, obtemos flexibilidade e benefícios adicionais fornecidos pelo Spring, além de todas as possibilidades da linguagem Java usando o Java DSL.
6. Conclusão
Neste artigo rápido, apresentamos uma introdução ao Apache Camel e demonstramos os benefícios do uso do Camel para tarefas de integração, como rotear arquivos de uma pasta para outra.
Em nosso exemplo, vimos que o Camel permite que você se concentre na lógica de negócios e reduz a quantidade de código padrão.
O código deste artigo pode ser encontradoover on GitHub.