2. Para ganhar um refcardz
The Top Twelve Integration Patterns for Apache Camel
! Envie um Twitter contendo:
#TDC2012 #ApacheCamel @pangeanet
Quero ganhar um refcardz!
Globalcode
–
Open4education
3. Meta
“Apresentar a DSL Java do Apache Camel
para tornar as integrações mais simples e
produtivas para os desenvolvedores.”
Globalcode
–
Open4education
5. O que são DSL’s*?
DSL’s são linguagens de programação com
expressividade limitada e que foram desenhadas
para tratar problemas de um domínio específico.
Linguagem Domínio Específico
CSS Definição de estilo e layout de páginas web
SQL Consultas em bases de dados relacionais
XUL Definição de interfaces com o usuário
Expressão Regular Casamento de padrões em strings
Ant Automatização de build’s
JPA Criteria Consultas de entidades OO
* Domain Specific Languages.
Globalcode
–
Open4education
6. A DSL do Apache Camel
Domínio:
! Integração de aplicações
utilizando padrões do livro
Enterprise Integration Patterns.
“Apache Camel é um
framework open-source
flexível baseado em EIPs.”
Camel implements EIPs
Globalcode
–
Open4education
7. Benefícios de uma boa DSL
“Produtividade”
1. O código fica mais fácil de compreender;
2. O programa fica mais simples de modificar;
3. Melhora a produtividade do desenvolvedor;
4. É facilmente entendida por especialistas do
domínio.
Globalcode
–
Open4education
8. Por que usar o Camel?
“Não reinventar a roda”
! Ele faz o trabalho pesado enquanto você foca no
problema de negócio.
Globalcode
–
Open4education
9. Números de um caso real
! Implementação do padrão Aggregator
! Sem usar o Apache Camel
! ~2711 LOC, ~25 Classes
! Usando o Apache Camel e sua DSL Java
~30x
! ~75 LOC, ~5 Classes
Globalcode
–
Open4education
13. JMS com a DSL Java
<<Channel>> <<Filter>>
<<Endpoint A>> <<Endpoint B>>
from(”file:c:dir”).to(”jms:aQueue”);
from(”jms:aQueue”).filter(isValid).to(B);
Globalcode
–
Open4education
14. Arquitetura do Camel
a 10 mil pés
Engine de Camel Context
Roteamento
Route 1 Processadores
A DSL liga
endpoints e Route 2 É onde o
processadores processamento da
para criar Route 3
lógica de
rotas.
integração
acontece.
... ... A DSL é usada
para implementar
File JMS
... FTP
os padrões de
integração.
Componentes
A DSL fornecem uma
interface uniforme para
criação de endpoints.
Globalcode
–
Open4education
15. Arquitetura modular
e plugável
! Mais de 50 EIPs implementados
http://camel.apache.org/enterprise_integration_patterns.html
! Mais de 80 Components disponíveis
(activemq, jms, bean, cxf, file, ftp, jdbc, ibatis, jetty, mina, netty,
timer, xslt, rss, atom, twitter, etc...)
http://camel.apache.org/components.html
! Diversos formatos de dados
(csv, serialization, zip, hl7, soap, jaxb, etc...)
http://camel.apache.org/data-format.html
! Diversas linguagens suportadas
(EL, Simple, XQuery, Xpath, JavaScript, Ruby, Python, PHP, etc...)
http://camel.apache.org/languages.html
Globalcode
–
Open4education
17. Contexto da Aplicação
Logística de
Entrega
Site E-Commerce Camel
E-Commerce
Controle de
Estoque
Globalcode
–
Open4education
18. Requisitos de Integração
! Buscar pedidos em arquivos XML do site em um
servidor FTP; Endpoint FTP
! Trabalhar com modelo POJO; Translator
! Processar os tipos de itens por processadores
especializados; Splitter e Content Enricher
! Entregar o pedido completo; Aggregator
! Disponibilizar arquivos TXT com dados dos
pedidos para entrega; Endpoint File
! Gravar dados dos pedidos em banco de dados
para controle de estoque. Endpoint JPA
Globalcode
–
Open4education
19. <<Message>> <<Message>>
Pedido XML Pedido POJO
Site E-Commerce
<<Endpoint>>
Pedido FTP
<<Translator>>
Pedido XML
para POJO
<<Channel>>
Pedidos Desenho da
Solução com EIP’s
<<Content Enricher>>
Produtos
Artesanais
<<Channel>>
<<Splitter>> <<Channel>> <<Content Based Router>> Itens
Pedido em Itens Itens Tipo do Item Processados
<<Content Enricher>>
Produtos
Industrializados
<<Channel>> <<Translator>> Logística de
Pedidos para <<Endpoint>>
Pedido POJO para Entrega
Entrega Arquivo TXT
TXT com Freemarker
<<Aggregator>> <<Recipient List>>
Itens de Pedidos Pedido Pronto
Multicast
<<Channel>> <<Endpoint>> Controle de
Pedidos para Banco de Dados Estoque
Baixa no Estoque Endpoint
Globalcode
–
Open4education
20. <<Message>> <<Message>>
Pedido XML Pedido POJO
Site E-Commerce
<<Endpoint>>
Pedido FTP
<<Translator>>
Pedido XML
para POJO
<<Channel>>
Pedidos Desenho da
Solução com EIP’s
<<Content Enricher>>
Produtos
Artesanais
<<Channel>>
<<Splitter>> <<Channel>> <<Content Based Router>> Itens
Pedido em Itens Itens Tipo do Item Processados
<<Content Enricher>>
Produtos
Industrializados
<<Channel>> <<Translator>> Logística de
Pedidos para <<Endpoint>>
Pedido POJO para Entrega
Entrega Arquivo TXT
TXT com Freemarker
<<Aggregator>> <<Recipient List>>
Itens de Pedidos Pedido Pronto
Multicast
<<Channel>> <<Endpoint>> Controle de
Pedidos para Banco de Dados Estoque
Baixa no Estoque Endpoint
Globalcode
–
Open4education
21. ROTA 1: Endpoint FTP +
Translator
<<Message>> <<Message>>
Pedido XML Pedido POJO
<<Endpoint>> <<Translator>> <<Channel>>
Site E-Commerce
Pedido FTP Pedido XML Pedidos
para POJO
public class BuscaPedidoXmlFtpRouteBuilder
extends RouteBuilder {
@Override
public void configure() {
from("ftp:localhost:2121/pedidos?
username=xxxxxxx&password=xxxxxxxxxx")
.convertBodyTo(Pedido.class)
.to("jms:pedidos");
}
}
Globalcode
–
Open4education
25. ROTA 3: Content Based
Router
<<Content Enricher>>
Produtos
Artesanais
<<Channel>>
<<Channel>> <<Content Based Router>> Itens
Itens Tipo do Item Processados
<<Content Enricher>>
Produtos
from("jms:itens") Industrializados
.choice()
.when(simple("${body.itens[0].tipo} ==
'ARTESANAL'"))
.bean(ProcessadorArtesanal.class)
.when(simple("${body.itens[0].tipo} ==
'INDUSTRIALIZADO'"))
.bean(ProcessadorIndustrializado.class)
.end()
.to("jms:itensProcessados");
Globalcode
–
Open4education
26. Um Processador de
Pedidos
public class ProcessadorArtesanal {
public Pedido preparar(Pedido pedido) {
Item item = pedido.getItens().get(0);
item.preparar();
// simulando tempo de processamento
Thread.sleep(1000);
return pedido;
}
Globalcode
–
Open4education
27. ROTA 4: Aggregator +
“Multicast”
<<Channel>>
Pedidos para
Entrega
<<Channel>>
<<Aggregator>> <<Recipient List>>
Itens
Itens de Pedidos Pedido Pronto
Processados
Multicast
<<Channel>>
Pedidos para
Baixa no Estoque
from("jms:itensProcessados")
.aggregate(header("PEDIDO_CORRELATION_ID"),
new PedidoAggregationStrategy())
.completionSize(header("PEDIDO_SIZE"))
.multicast().parallelProcessing()
.to("jms:pedidosProntosEntrega",
"jms:pedidosProntosBaixaEstoque");
Globalcode
–
Open4education
28. ROTA 5: Endpoints
Freemarker e File
<<Channel>> <<Translator>> Logística de
Pedidos para <<Endpoint>>
Pedido POJO para Entrega
Entrega Arquivo TXT
TXT com Freemarker
from("jms:pedidosProntosEntrega")
.to("freemarker:ecommerce/pedido_ecommerce.ftl")
.to("file:ecommerce/entregas/?
fileName=entrega-
$simple{date:now:yyyyMMddHHmmssSSS}.txt");
Globalcode
–
Open4education
29. ROTA 6: Endpoint JPA
<<Channel>> <<Endpoint>> Controle de
Pedidos para Banco de Dados Estoque
Baixa no Estoque Endpoint
from("jms:pedidosProntosBaixaEstoque")
.to("jpa:tdc2012.camel.ecommerce.domain.Pedido");
Globalcode
–
Open4education
30. Demo
! - Execução da aplicação;
! - Subindo o contexto do Apache Camel;
! - Escalabilidade com o Competing Consumers.
Globalcode
–
Open4education
32. Conclusão
A DSL Java do Apache Camel confere:
! Vocabulário comum baseado em EIPs;
! Produtividade para o desenvolvedor
Em projetos de integração não reinvente a roda.
Considere utilizar o Apache Camel!
Globalcode
–
Open4education