Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

35
Globalcode – Open4education Produtividade em Integração de Aplicações com Apache Camel

Transcript of Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

Page 1: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

Globalcode  –  Open4education

Produtividade em Integração de Aplicações com Apache Camel

Page 2: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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!

Page 3: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

Globalcode  –  Open4education

Meta

“Apresentar a DSL Java do Apache Camel para tornar as integrações mais simples e

produtivas para os desenvolvedores.”

Page 4: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

Globalcode  –  Open4education

Agenda

!  Conceitos Fundamentais !  Arquitetura do Apache Camel !  Desenho & Implementação !  Demo !  Conclusão !  Perguntas & Respostas

Page 5: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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.

Page 6: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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.”

Page 7: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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”

Page 8: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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”

Page 9: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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

Page 10: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

Globalcode  –  Open4education

Agenda

!  Conceitos Fundamentais !  Arquitetura do Apache Camel !  Desenho & Implementação !  Demo !  Conclusão !  Perguntas & Respostas

Page 11: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

Globalcode  –  Open4education

Roteamento com a DSL Java

from(A) .filter(isValid) .to(B);

<<Endpoint A>> <<Endpoint B>> <<Filter>> <<Processor>>

Page 12: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

Globalcode  –  Open4education

Endpoint URI

"file:c:\dir?delay=5000" "jms:aQueue?competingConsumers=10"

"schema:contextpath?option=value"

Page 13: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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>>

Page 14: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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.

Page 15: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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

Page 16: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

Globalcode  –  Open4education

Agenda

!  Conceitos Fundamentais !  Arquitetura do Apache Camel !  Desenho & Implementação !  Demo !  Conclusão !  Perguntas & Respostas

Page 17: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

Globalcode  –  Open4education

Contexto da Aplicação

Site E-Commerce

Logística de Entrega

Controle de Estoque

CamelE-Commerce

Page 18: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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

Page 19: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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

Page 20: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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

Page 21: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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

Page 22: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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>

Page 23: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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;

… }

Page 24: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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

Page 25: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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

Page 26: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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;

}

Page 27: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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”

Page 28: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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

Page 29: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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

Page 30: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

Globalcode  –  Open4education

Demo

!   - Execução da aplicação;

!   - Subindo o contexto do Apache Camel;

!   - Escalabilidade com o Competing Consumers.

Page 31: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

Globalcode  –  Open4education

Agenda

!  Conceitos Fundamentais !  Arquitetura do Apache Camel !  Desenho & Implementação !  Demo !  Conclusão !  Perguntas & Respostas

Page 32: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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!

Page 33: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

Globalcode  –  Open4education

Perguntas & Respostas

Page 34: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

Globalcode  –  Open4education

Agradecimentos

Page 35: Produtividade em integração de aplicações com apache camel tdc2012-são paulo-v1.3

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