produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3
TRANSCRIPT
Globalcode – Open4education
Produtividade em Integração de Aplicações com Apache Camel
Globalcode – Open4education
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
Meta
“Apresentar a DSL Java do Apache Camel para tornar as integrações mais simples e
produtivas para os desenvolvedores.”
Globalcode – Open4education
Agenda
! Conceitos Fundamentais ! Arquitetura do Apache Camel ! Desenho & Implementação ! Demo ! Conclusão ! Perguntas & Respostas
Globalcode – Open4education
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
A DSL do Apache Camel
Domínio: ! Integração de aplicações
utilizando padrões do livro Enterprise Integration Patterns.
Camel implements EIPs
“Apache Camel é um framework open-source
flexível baseado em EIPs.”
Globalcode – Open4education
Benefícios de uma boa DSL
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.
“Produtividade”
Globalcode – Open4education
Por que usar o Camel?
! Ele faz o trabalho pesado enquanto você foca no problema de negócio.
“Não reinventar a roda”
Globalcode – Open4education
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
! ~75 LOC, ~5 Classes ~30x
Globalcode – Open4education
Agenda
! Conceitos Fundamentais ! Arquitetura do Apache Camel ! Desenho & Implementação ! Demo ! Conclusão ! Perguntas & Respostas
Globalcode – Open4education
Roteamento com a DSL Java
from(A) .filter(isValid) .to(B);
<<Endpoint A>> <<Endpoint B>> <<Filter>> <<Processor>>
Globalcode – Open4education
Endpoint URI
"file:c:\dir?delay=5000" "jms:aQueue?competingConsumers=10"
"schema:contextpath?option=value"
Globalcode – Open4education
<<Filter>>
JMS com a DSL Java
from(”file:c:\dir”).to(”jms:aQueue”); from(”jms:aQueue”).filter(isValid).to(B);
<<Endpoint A>> <<Endpoint B>> <<Channel>>
Globalcode – Open4education
Camel Context
Arquitetura do Camel a 10 mil pés
File JMS FTP
Route 1
Route 2
Route 3
... ...
Componentes A DSL fornecem uma interface uniforme para criação de endpoints.
...
Processadores É onde o processamento da lógica de integração acontece. A DSL é usada para implementar os padrões de integração.
Engine de Roteamento A DSL liga endpoints e processadores para criar rotas.
Globalcode – Open4education
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
Agenda
! Conceitos Fundamentais ! Arquitetura do Apache Camel ! Desenho & Implementação ! Demo ! Conclusão ! Perguntas & Respostas
Globalcode – Open4education
Contexto da Aplicação
Site E-Commerce
Logística de Entrega
Controle de Estoque
CamelE-Commerce
Globalcode – Open4education
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
<<Splitter>>Pedido em Itens
<<Channel>>Itens
<<Aggregator>>Itens de Pedidos
<<Channel>>Pedidos para
Entrega
<<Recipient List>>Pedido Pronto
Multicast
<<Channel>>Pedidos para
Baixa no Estoque
<<Endpoint>>Arquivo TXT
<<Translator>>Pedido POJO para
TXT com Freemarker
Logística de Entrega
<<Channel>>Pedidos para
Entrega
<<Endpoint>>Banco de Dados
Endpoint
Controle de Estoque
<<Channel>>Pedidos para
Baixa no Estoque
<<Endpoint>>Pedido FTP
<<Channel>>Pedidos
<<Message>>Pedido XML
<<Translator>> Pedido XML para POJO
<<Message>>Pedido POJO
Site E-Commerce
<<Channel>>Itens
<<Content Based Router>>Tipo do Item
<<Content Enricher>>Produtos
Industrializados
<<Content Enricher>>Produtos
Artesanais
<<Channel>>Itens
Processados
Desenho da Solução com EIP’s
Globalcode – Open4education
<<Splitter>>Pedido em Itens
<<Channel>>Itens
<<Aggregator>>Itens de Pedidos
<<Channel>>Pedidos para
Entrega
<<Recipient List>>Pedido Pronto
Multicast
<<Channel>>Pedidos para
Baixa no Estoque
<<Endpoint>>Arquivo TXT
<<Translator>>Pedido POJO para
TXT com Freemarker
Logística de Entrega
<<Channel>>Pedidos para
Entrega
<<Endpoint>>Banco de Dados
Endpoint
Controle de Estoque
<<Channel>>Pedidos para
Baixa no Estoque
<<Endpoint>>Pedido FTP
<<Channel>>Pedidos
<<Message>>Pedido XML
<<Translator>> Pedido XML para POJO
<<Message>>Pedido POJO
Site E-Commerce
<<Channel>>Itens
<<Content Based Router>>Tipo do Item
<<Content Enricher>>Produtos
Industrializados
<<Content Enricher>>Produtos
Artesanais
<<Channel>>Itens
Processados
Desenho da Solução com EIP’s
Globalcode – Open4education
<<Endpoint>>Pedido FTP
<<Channel>>Pedidos
<<Message>>Pedido XML
<<Translator>> Pedido XML para POJO
<<Message>>Pedido POJO
Site E-Commerce
public class BuscaPedidoXmlFtpRouteBuilder extends RouteBuilder {
@Override public void configure() { from("ftp:localhost:2121/pedidos?
username=xxxxxxx&password=xxxxxxxxxx") .convertBodyTo(Pedido.class) .to("jms:pedidos"); } }
ROTA 1: Endpoint FTP + Translator
Globalcode – Open4education
Arquivo XML de Pedido
<pedido cliente="11111111111"> <itens> <item> <nome>Camisa customizada</nome> <quantidade>1</quantidade> <tipo>ARTESANAL</tipo> </item> <item> <nome>Camisa branca</nome> <quantidade>3</quantidade> <tipo>INDUSTRIALIZADO</tipo> </item> </itens> </pedido>
Globalcode – Open4education
Pedido com anotações JAXB e JPA
@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) @Entity public class Pedido implements Serializable {
@XmlAttribute private String cliente;
@XmlElementWrapper @XmlElement(name="item") @OneToMany(cascade = CascadeType.ALL) private List<Item> itens;
… }
Globalcode – Open4education
from("jms:pedidos") .split().method(PedidoSplitter.class) .setHeader("PEDIDO_CORRELATION_ID",
property("CamelCorrelationId")) .setHeader("PEDIDO_SIZE",
property("CamelSplitSize")) .to("jms:itens");
<<Channel>>Pedidos
<<Splitter>>Pedido em Itens
<<Channel>>Itens
ROTA 2: Splitter
Globalcode – Open4education
from("jms:itens") .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");
<<Channel>>Itens
<<Content Based Router>>Tipo do Item
<<Content Enricher>>Produtos
Industrializados
<<Content Enricher>>Produtos
Artesanais
<<Channel>>Itens
Processados
ROTA 3: Content Based Router
Globalcode – Open4education
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
from("jms:itensProcessados") .aggregate(header("PEDIDO_CORRELATION_ID"),
new PedidoAggregationStrategy()) .completionSize(header("PEDIDO_SIZE"))
.multicast().parallelProcessing() .to("jms:pedidosProntosEntrega",
"jms:pedidosProntosBaixaEstoque");
<<Aggregator>>Itens de Pedidos
<<Channel>>Itens
Processados
<<Channel>>Pedidos para
Entrega
<<Recipient List>>Pedido Pronto
Multicast
<<Channel>>Pedidos para
Baixa no Estoque
ROTA 4: Aggregator + “Multicast”
Globalcode – Open4education
from("jms:pedidosProntosEntrega") .to("freemarker:ecommerce/pedido_ecommerce.ftl") .to("file:ecommerce/entregas/?
fileName=entrega- $simple{date:now:yyyyMMddHHmmssSSS}.txt");
<<Endpoint>>Arquivo TXT
<<Translator>>Pedido POJO para
TXT com Freemarker
Logística de Entrega
<<Channel>>Pedidos para
Entrega
ROTA 5: Endpoints Freemarker e File
Globalcode – Open4education
from("jms:pedidosProntosBaixaEstoque") .to("jpa:tdc2012.camel.ecommerce.domain.Pedido");
<<Endpoint>>Banco de Dados
Endpoint
Controle de Estoque
<<Channel>>Pedidos para
Baixa no Estoque
ROTA 6: Endpoint JPA
Globalcode – Open4education
Demo
! - Execução da aplicação;
! - Subindo o contexto do Apache Camel;
! - Escalabilidade com o Competing Consumers.
Globalcode – Open4education
Agenda
! Conceitos Fundamentais ! Arquitetura do Apache Camel ! Desenho & Implementação ! Demo ! Conclusão ! Perguntas & Respostas
Globalcode – Open4education
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
Perguntas & Respostas
Globalcode – Open4education
Agradecimentos
Globalcode – Open4education
Contatos para consultoria e treinamento
Adriano Tavares [email protected] @adrianotavares adrianotavares.com linkedin.com/in/adrianotavares
Alessandro Kieras
[email protected] @kierasbr kieras.com.br linkedin.com/in/kieras