SlideShare uma empresa Scribd logo
1 de 69
Baixar para ler offline
spring
integration
padrões de!
integração
de sistemas! com!
Julho/2015
helderdarocha!
helder@argonavis.com.br
4.0
Conteúdo!
1.  Padrões de Integração de Sistemas (EIP)!
Overview e principais componentes!
2.  Um problema de integração!
Solução teórica do problema usando EIP!
3.  Spring Integration!
Solução prática do problema com Spring Integration!
4.  Alternativas!
Quem sou? Who am I? Кто я?!
Helder da Rocha!
tecnologia + ciência + arte!
Java desde 1995!
Web, XML, Design!
+ de 2500 alunos !
+ de 8000 horas de aula!
argonavis.com.br!
helderdarocha.com.br!
argonavis.com.br
Por que integrar?!
•  Aplicações interessantes raramente vivem isoladas
•  Sincronizar emails, calendários, etc.!
•  Vincular portal a um aplicativo de controle de estoque!
•  Integrar com serviços e dados na nuvem!
•  Evitar reinventar a roda!
•  Reusar serviços que funcionam bem!
•  Pontos de integração existem!
•  Com integração aplicações podem ficar melhores
Desafios das soluções de integração!
Redes não são confiáveis
Redes são lentas
Aplicações são diferentes
Aplicações mudam
Soluções são complexas
Estratégias(estilos) de integração
Transferência e Arquivos (1)!
Banco de Dados Compartilhado (2)!
RPC (3)!
Mensageria (4) !
Métodos de comunicação!
Assíncrono: cliente chama o
serviço e não espera a
operação terminar
Mensageria!
Síncrono: cliente chama o
serviço e espera pelo

fim da execução da operação
RPC!
O que é mensageria?!
•  Comunicação entre máquinas!
•  Através de mensagens enviados em canais (filas)
compartilhados entre as máquinas!
•  Remetente, produtor de mensagens!
•  Destinatário, consumidor de mensagens!
•  Mensagem!
•  Estrutura de dados (objeto, string, tipo, bytes)!
•  Cabeçalho, metadados!
•  Corpo, payload
O que é um sistema de mensageria?!
•  Message Oriented Middleware!
•  Mediator pattern (GoF) entre consumidores e produtores!
•  Administra o sistema (canais e conexões)!
•  Etapas!
•  Criar – produtor cria a mensagem e preenche com dados!
•  Enviar – produtor adiciona mensagem a um canal!
•  Entregar – sistema de mensageria transfere a mensagem de uma
máquina para a outra tornando-a disponível ao consumidor!
•  Receber – consumidor lê a mensagem do canal!
•  Processar – consumidor extrai os dados da mensagem!
Padrões de design!
•  Abstração de alto nível!
•  Nome / Icone!
•  Contexto!
•  Problema / Solução / Exemplo!
•  Vocabulário!
•  Notação!
•  Padrões relacionados!
•  Conseqüências da aplicação do padrão!
Padrões de integração!
•  65 padrões de integração
de sistemas!
•  Aplicações em Java, .NET e
outras plataformas!
•  62 focam em soluções de
mensageria!
•  Foco: minimizar o
acoplamento entre
componentes!
Padrões de Mensageria (4)!
(1)
 (2)
 (3)
 (4)
(5)
 (6)
 (7)
 (8)
 (9)
 (10)
Mensageria

(Messaging)
Canal de 

Mensagens
(Message Channel)
Mensagem
(Message)
Dutos e 

Filtros
(Pipes and Filters)
Roteador 

de Mensagens
(Message Router)
Tradutor de 

Mensagens
(Message Translator)
Terminal de 

Mensagens
(Message Endpoint)
Arquitetura dutos e filtros
•  Padrão de arquitetura (PEAA*)!
•  Representa a conexão de componentes (filtros), em série,
através de dutos (canais) que os conectam!
•  Decorator (GoF**) e Intercepting Filter (PEAA)!
•  Em vez de enviar a mensagem diretamente ao destinatário,
pode-se interceptá-la em etapas intermediárias para validação
do seu conteúdo, roteamento, transformação de dados, etc. !
•  Cada componente age como filtro; cada canal age como duto.!
•  Processamento pipeline; paralelismo!
Fonte: eaipatterns.com
Message Channel!
PROBLEMA “Como pode uma aplicação comunicar-se com
outra aplicação usando mensageria?”
SOLUÇÃO “Conectar as aplicações usando um Canal de
Mensagens (Message Channel), onde uma aplicação grava
informação no canal e a outra lê do canal.”
Fonte: eaipatterns.com
Message!
PROBLEMA “Como é que duas aplicações conectadas por um
canal de mensagens podem trocar informação?”
SOLUÇÃO “Empacote a informação dentro de uma Mensagem
(Message), um registro de dados que o sistema de mensageria
pode transmitir através de um canal de mensagens.”
Message Endpoint!
PROBLEMA “Como pode uma aplicação conectar-se a um canal
de mensageria para enviar e receber mensagens?”
SOLUÇÃO “Conecte uma aplicaçao a um canal de mensageria
usando um Terminal de Mensagens (Message Endpoint), um
cliente do sistema de mensageria que a aplicação pode usar para
enviar ou receber mensagens.”
Imagens: eaipatterns.com
Message Router!
PROBLEMA “Como desacoplar passos individuais de
processamento de forma que mensagens possam ser passadas
para diferentes filtros dependendo de uma série de condições?”
SOLUÇÃO “Use um filtro especial, um Roteador de Mensagens
(Message Router) que consome uma Mensagem de um Canal de
Mensagens e publique-a em outro Canal de Mensagens,
dependendo de uma série de condições.”
!
Imagens: eaipatterns.com
Message Translator!
PROBLEMA “Como é possível realizar a comunicação usando
mensageria, entre sistemas que usam formatos de dados diferentes?”
SOLUÇÃO “Use um filtro especial, um Tradutor de Mensagens
(Message Translator), entre outros filtros ou aplicações para traduzir
de um formato de dados para outro.”
Imagens: eaipatterns.com
Padrões de Canal de Mensagens (5)!
(4)
(11)
(12)
(13)
(14)
canal
mensageria
(5)
(15)
(16)
(17)
(18)
(19)
canal

ponto-a-

ponto
canal

publicar-

assinar
 canal

tipo-de

dados
 canal

mensagens

inválidas
 canal

mensagens

não-entregues
entrega

garantida
ponte de

mensageria
adaptador

de canal
barramento
Point-to-point channel!
PROBLEMA “Como o remetente pode ter certeza que
apenas um destinatário irá receber a mensagem ou executar um
comando?”
SOLUÇÃO “Envie a mensagem através de um Canal Ponto-
a-Ponto, que garante que apenas um destinatário irá receber a
mensagem.”
Imagens: eaipatterns.com
Publish-subscribe channel!
PROBLEMA “Como pode um remetente transmitir um evento a
todos os destinatários interessados?”
SOLUÇÃO “Envie o evento para um Canal Publicar-Inscrever, que
entrega uma cópia do evento a cada destinatário.”
Imagens: eaipatterns.com
Channel Adapter!
PROBLEMA “Como conectar uma aplicação ao sistema de
messaging para que ela possa enviar e receber mensagens?”
SOLUÇÃO “Use um Channel Adapter que pode acessar a API
da aplicação ou seus dados, e publique mensagens em um canal
baseado nesses dados, e que possa receber mensagens e
chamar funcionalidades dentro da aplicação”
Imagens: eaipatterns.com
Padrões de Construção de Mensagens (6) !
Formato!
(4)
(20)
(21)
(22)
(23)
mensagem
mensageria
(6)
(24)
(25)
(26)
(27)
(28)
mensagem

comando
mensagem

documento
mensagem

evento
requisição

resposta
 endereço
resposta
ID de

correlação
sequência
prazo de

validade
indicador

de formato
Request-Reply!
PROBLEMA “Quando uma aplicação envia uma mensagem,
como ela pode obter uma resposta do servidor?”
SOLUÇÃO “Envie um par de mensagens Requisição-
Resposta, cada uma no seu próprio canal”
Imagens: eaipatterns.com
Padrões de Roteamento de Mensagens (8) !
Scatter!
Gather!
(7)
processador
composto
dutos e filtros
(4)
(30)
(29)
(34)
(31)
(33)
(36)
roteador
mensageria
(8)
(35)
(32)
(39)
(37)
(38)
(40)
corretor de 

mensagens
gerente de 

processos
lista de

circulação
espalha-

recolhe
Roteadores
simples
Roteadores
compostos
Arquitetura
roteador baseado

em conteúdo
divisor
filtro
roteador

dinâmico
agregador
re-sequenciador
lista de

destinatários
Content-Based Router!
PROBLEMA “Como lidar com a situação onde a
implementação de uma única função lógica está
espalhada por múltiplos sistemas físicos?”
SOLUÇÃO “Use um Roteador Baseado em
Conteúdo para rotear cada mensagem para o receptor
correto baseado no conteúdo da mensagem”
Imagens: eaipatterns.com
Recipient List!
PROBLEMA “Como rotear uma mensagem para uma lista de
receptores especificados dinamicamente?”
SOLUÇÃO “Defina um canal para cada receptor. Depois use uma
Lista de Destinatários para inspecionar uma mensagem entrante,
determine a lista de receptores desejados, e repasse a mensagem
para todos os canais associados com os receptores da lista.”
Imagens: eaipatterns.com
Splitter e Aggregator!
Imagens: eaipatterns.com
Message Filter!
PROBLEMA “Como um componente pode evitar o
recebimento de mensagens que não interessam?”
SOLUÇÃO “Use um tipo especial de roteador, um Filtro
de Mensagens, para eliminar mensagens indesejadas de
um canal com base em um conjunto de critérios.”
Imagens: eaipatterns.com
Padrões relacionados a Message Translator (9) !
(4)
(41)
 (42)
 (43)
 (44)
 (45)
 (46)
tradutor
empacotador
de envelope
enriquecedor

de conteúdo
filtro

de conteúdo
recibo de

bagagem
normalizador
 modelo de

dados

canônico
mensageria
(9)
Content Enricher / Filter!
Imagens: eaipatterns.com
Claim Check!
PROBLEMA “Como podemos reduzir o volume de dados de uma mensagem
enviada através do sistema sem sacrificar o conteúdo da informação?”
SOLUÇÃO “Guarde os dados da mensagem em um repositório persistente e
passe um Recibo de Bagagem para os componentes seguintes. Esses
componentes poderão usar o Recibo para recuperar a informação armazenada”
Imagens: eaipatterns.com
Padrões para Terminais de Mensageria (10)!
consumidor

seletivo
gateway de

mensageria
ativador de
serviço
consumidores
concorrentes
(4)
(47)
(48)
(49)
(50)
(51)
(57)
terminal
mensageria
(10)
(52)
(53)
(54)
(55)
(56)
mapeador de

mensageria
cliente

transacional
consumidor

de sondagem
consumidor

ativado por evento
despachante

de mensagens
assinante

durável
receptor

idempotente
Envio/Recebimento
Consumidores
(endpoint)
Messaging Gateway!
PROBLEMA “Como isolar o acesso ao sistema de mensageria do
restante da aplicação?”
SOLUÇÃO “Use um Gateway de Mensageria, uma classe que
encapsula chamadas especificas ao sistema de mensageria e expõe
uma interface com métodos específicos ao domínio da aplicação”
Imagens: eaipatterns.com
Service Activator!
PROBLEMA “Como projetar um serviço que possa ser
chamado de forma síncrona (sem usar mensageria) ou de
forma assíncrona (usando tecnologias de mensageria)?”
SOLUÇÃO “Projete um Ativador de Serviços que conecte
as mensagens do canal ao serviço”
Imagens: eaipatterns.com
Padrões de Gerenciamento do Sistema!
Control Bus (Barramento de Controle) (58)!
Detour (Desvio) (59)!
Wire Tap (Escuta) (60)!
Message History (Histórico de Mensagens) (61)!
Message Store (Repositório de Mensagens) (62)!
Smart Proxy (Proxy Inteligente) (63)!
Test Message (Mensagem de Teste) (64)!
Channel Purger (Purificador de Canal) (65)!
Como usar os padrões?!
•  Os padrões são abstrações de alto nível que permitem
descrever a solução de um problema de integração!
•  Use os padrões para descrever a arquitetura de rotas
de uma solução de integração!
•  Não há solução única para cada tipo de problema!
•  Mesmos resultados podem ser alcançados com
arquiteturas diferentes (+ conseqüências diferentes)!
•  Exemplo: duas formas de filtrar mensagens!
•  Predictive routing: Message Router com rotas pré-definidas!
•  Reactive filtering: Canal Pub-Sub com Message Filter!
Um problema de integração!
•  Obter todas as mensagens com hashtag #TheDevConf
ou #TDC2015 no Twitter, periodicamente (polling)!
•  Processar apenas mensagens que tiverem links
•  Estruturar o conteúdo das mensagens identificando
hashtags, usuários, links e remetentes
•  Separar mensagens que tratam de “Java” das demais
mensagens!
•  Disponibilizar (arquivo, Web, etc.) duas listas de
mensagens (Java e outras)!
Uma solução usando padrões!
Channel!
Adapter de entrada
para Twitter!
Extrair dados do Tweet
e guardar em uma !
mensagem simples!
Filtro para jogar fora
mensagens que não
têm links!
Adicionar cabeçalho!
com assunto da!
mensagem!
Converter mensagem
em fragmento HTML!
Separar mensagens!
que falam sobre Java d
as demais mensagens!
Adaptadores de canal
para streams, arquivos
ou serviços Web!
Como implementar?!
•  Uma linguagem de programação (ex: Java) + um
serviço de mensageria (ex: JMS + ActiveMQ)!
•  Desvantagem: é preciso ter cuidado para componentes
não ficarem excessivamente acoplados!
•  Um framework que implemente padrões de
integração de sistemas!
•  Mule ESB!
•  Apache Camel!
•  Spring Integration!
Spring Integration!
•  Solução do Spring Framework / Spring IO!
•  Integrado ao ecossistema do Spring!
•  Configuração através de XML ou anotações
•  Rotas em XML ou Java DSL
Spring Framework!
•  Spring é uma plataforma Java construída sobre conceitos
injeção de dependências (DI) e aspectos!
•  Componentes Spring (beans) são POJOs, vivem em um
container e são interligados pelo framework usando DI
•  O container inicializa um contexto que instancia e realiza as
ligações (wiring) entre componentes !
•  A configuração é feita declarativamente usando defaults (wiring
automático), XML e anotações!
•  Exemplo de inicialização de contexto configurado em XML!
ApplicationContext	
  ctx	
  =	
  new	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ClassPathXmlApplicationContext("beans.xml");	
  	
  
Exemplo de wiring em XML!
<bean id="hibernateTemplate"
class="org.springframework.orm.
hibernate.HibernateTemplate">
<property name="sessionFactory”
ref="sessionFactory"/>
</property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.
hibernate.LocalSessionFactoryBean">
...
</bean>
<bean id="produtosDao"
class="loja.ProdutosDao">
<property name="hibernateTemplate"
ref="hibernateTemplate"/>
</property> ...
</bean>
dataSource
ApplicationContext!
•  Através do contexto pode-se localizar e usar
instâncias de beans (se for necessário)!
ApplicationContext	
  ctx	
  =	
  
	
  	
  	
  	
  new	
  ClassPathXmlApplicationContext("beans.xml");	
  	
  
ProdutosDao	
  bean	
  =	
  (ProdutosDao)	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ctx.getBean("produtosDao");	
  
Produto	
  p	
  =	
  bean.findProduto(123);	
  
BidDecimal	
  preco	
  =	
  p.getPreco();	
  
Ecossistema Spring!
Maven
•  Os módulos Spring geralmente são incluídos em
um projeto através do Maven ou Gradle!
	
  <dependencies>	
  
	
   	
  <dependency>	
  
	
   	
   	
  <groupId>org.springframework.integration</groupId>	
  
	
   	
   	
  <artifactId>spring-­‐integration</artifactId>	
  
	
   	
   	
  <version>4.0.4.RELEASE</version>	
  
	
   	
  </dependency>	
  
	
   	
  <dependency>	
  
	
   	
   	
  <groupId>org.springframework.integration</groupId>	
  
	
   	
   	
  <artifactId>spring-­‐integration-­‐twitter</artifactId>	
  
	
   	
   	
  <version>4.0.4.RELEASE</version>	
  
	
   	
  </dependency>	
  
	
   	
  <dependency>	
  
	
   	
   	
  <groupId>org.springframework.social</groupId>	
  
	
   	
   	
  <artifactId>spring-­‐social-­‐twitter</artifactId>	
  
	
   	
   	
  <version>1.1.0.RELEASE</version>	
  
	
   	
  </dependency>	
  
	
  </dependencies>	
  
Configuração do contexto!
•  Para usar configuração declarativa XML também é
necessário declarar XSD de componentes usados!
<beans	
  xmlns="http://www.springframework.org/schema/beans”	
  
	
  	
  	
  	
  	
  	
  	
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-­‐instance"	
  	
  
	
  	
  	
  	
  	
  	
  	
  xmlns:int="http://www.springframework.org/schema/integration"	
  
	
   	
  xsi:schemaLocation="	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  http://www.springframework.org/schema/integration	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  http://www.springframework.org/schema/integration/	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  spring-­‐integration-­‐4.0.xsd">	
  
	
  
	
  	
  	
  	
  <bean	
  id="teste"	
  class="teste.Hello"	
  />	
  
	
  	
  	
  	
  <int:channel	
  id="tweets"	
  />	
  
</beans>	
  
Ferramenta STS
•  Spring Tool Suite (Eclipse)!
•  Facilita desenvolvimento (ex: automaticamente cria
arquivos de configuração e adiciona namespaces)!
Solução usando SI!
•  Para implementar a solução apresentada usando
padrões EIP em Spring Integration usaremos!
•  Um Inbound Channel Adapter para Twitter !
(spring-integration-twitter + spring-social-twitter)!
•  Dois Outbound Channel Adapters para Arquivos !
(spring-integration-file)!
•  Vários Message Channel <channel>
•  Dois Message Translators <transformer>
•  Um Content-Based Router <header-value-router>
•  Um Content Enricher <header-enricher>
•  Um Message Filter <filter>
Inbound Channel Adapter
“#TheDevConf	
  OR	
  #tdc2015”	
  
Translator: Extrai dados de objeto
Tweet e cria novo objeto Message
Faz query no Twitter:
Põe mensagens no canal raw-tweets
sender: usuario
outros headers: …
Payload:
texto da mensagem
tweet.fromUser =
usuario
tweet.text: =
texto da mensagem
headers: …
Payload: o.s…Tweet
Canais do Spring Integration!
MessageChannel!
!
send(Message)!
PollableChannel!
!
receive(): Message!
SubscribableChannel!
!
subscribe(MessageHandler)!
unsubscribe(MessageHandler)!
DirectChannel!
PublishSubscribeChannel!
PriorityChannel!
QueueChannel!
RendezvousChannel!
ExecutorChannel!
<int:channel>!
<int:publish-subscribe-channel>!
<int:channel datatype=“type”>!
<int:channel>!
<int:queue/>!
</int:channel>!
<int:channel>!
<int:priority-queue/>!
</int:channel>!
<int:channel>!
<int:dispatcher/>!
</int:channel>!
<int:channel>!
<int:rendezvous-queue/>!
</int:channel>!
MessageHandler!
Direct channels!
•  Canal default do Spring Integration!
•  Podem ser configurados em XML ou via anotações!
<beans	
  xmlns="http://www.springframework.org/schema/beans"	
  	
  
	
  	
  	
  	
  	
  	
  	
  xmlns:int="…"	
  	
  
	
  	
  	
  	
  	
  	
  	
  …	
  	
  
	
  	
  	
  	
  	
  	
  	
  outros	
  xmlns	
  …>	
  
	
  
	
  	
  	
  	
  <bean	
  id="componente"	
  class="com.pacote.Classe"	
  />	
  
	
  	
  	
  	
  	
  …	
  
	
  	
  	
  	
  <int:channel	
  id="tweets"	
  />	
  
	
  	
  	
  	
  <int:channel	
  id="tech-­‐tweets"	
  />	
  
	
  	
  	
  	
  <int:channel	
  id="tagged-­‐tweets"	
  />	
  
	
  	
  	
  	
  <int:channel	
  id="decorated-­‐tweets"	
  />	
  
	
  	
  	
  	
  <int:channel	
  id="java-­‐tweets"	
  />	
  
	
  	
  	
  	
  <int:channel	
  id="other-­‐tweets"	
  />	
  
…	
  
</beans>	
  
Arquivo de configuração de contexto (beans)!
Twitter template!
•  Da API Spring Social
•  Necessário para !
poder fazer !
queries na API !
do Twitter!
<context:property-­‐placeholder	
  location="classpath:oauth.properties"	
  />	
  
	
  
<bean	
  id="twitterTemplate"	
  
	
   	
  class="org.springframework.social.twitter.api.impl.TwitterTemplate">	
  
	
  	
  	
  	
  <constructor-­‐arg	
  value="${twitter.oauth.consumerKey}"	
  />	
  
	
  	
  	
  	
  <constructor-­‐arg	
  value="${twitter.oauth.consumerSecret}"	
  />	
  
	
  	
  	
  	
  <constructor-­‐arg	
  value="${twitter.oauth.accessToken}"	
  />	
  
	
  	
  	
  	
  <constructor-­‐arg	
  value="${twitter.oauth.accessTokenSecret}"	
  />	
  
</bean>	
  
twitter.oauth.consumerKey=kSJz4Iy6kcPcLw9wdUaP	
  
twitter.oauth.consumerSecret=kSJz4Iy6kcPcLw9wdUa
twitter.oauth.accessToken=kSJz4Iy6kcPcLw9wdUaPcc	
  
twitter.oauth.accessTokenSecret=dSJz4Iy6kc9wdUaP	
  
oauth.properties!
Spring application context (beans)!
Crie app e obtenha as chaves!
Twitter channel adapters!
•  Spring Integration possui vários adaptadores de
entrada e saída (direct message, search, etc.)!
•  Usamos o search-inbound- para fazer queries!
<int-­‐twitter:search-­‐inbound-­‐channel-­‐adapter	
  
	
  	
  	
  	
  	
  	
  twitter-­‐template="twitterTemplate"	
  	
  
	
  	
  	
  	
  	
  	
  query="#thedevconf	
  OR	
  #tdc2015"	
  	
  
	
  	
  	
  	
  	
  	
  id="raw-­‐tweets">	
  
	
   	
  	
  	
  	
  	
  <int:poller	
  fixed-­‐rate="60000"	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  max-­‐messages-­‐per-­‐poll="10"	
  />	
  
</int-­‐twitter:search-­‐inbound-­‐channel-­‐adapter>	
  
Automaticamente cria
um direct channel
Message Translator 1!
•  Para traduzir o payload (objeto Tweet do Spring Social)
para uma nova Message (do Spring Integration)!
import	
  org.springframework.social.twitter.api.Tweet;	
  
	
  
public	
  class	
  TweetTransformer	
  implements	
  Transformer	
  {	
  
	
  
	
  @Override	
  
	
  public	
  Message<?>	
  transform(Message<?>	
  msg)	
  {	
  
	
   	
  Tweet	
  tweet	
  	
  	
  =	
  (Tweet)	
  msg.getPayload();	
  
	
   	
  String	
  sender	
  =	
  tweet.getFromUser();	
  
	
   	
  String	
  text	
  	
  	
  =	
  tweet.getText();	
  
	
   	
  	
  
	
   	
  Message<String>	
  message	
  =	
  MessageBuilder.withPayload(text)	
  
	
   	
   	
   	
  .setHeader("sender",	
  sender)	
  
	
   	
   	
   	
  .build();	
  	
  
	
   	
  return	
  message;	
  
	
  }	
  
}	
  
<int:transformer	
  input-­‐channel="raw-­‐tweets"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  output-­‐channel="tweets">	
  
	
  	
  	
  <bean	
  class="br...tdc.TweetTransformer"	
  />	
  
</int:transformer>	
  Spring application context (beans)!
Message Filter
Filtra as mensagens
selecionando apenas as
que têm links (http / https)
Apenas mensagens com links
estão neste canal
sender: usuario
outros headers: …
Payload:
texto da mensagem
Invalid-Message Channel
(mensagens que nâo tem links)
Message Filters!
•  Utiliza um seletor (bean ou expressão SpEL) para escolher
mensagens a serem filtradas!
•  Opcionalmente pode enviar as mensagens descartadas para um
Invalid-Message Channel
<bean	
  id="techTweetSelector"	
  	
  
	
  	
  	
  	
  	
  class="br.com.argonavis.si.examples.tdc.LinkTweetSelector"	
  />	
  
	
  
<int:filter	
  input-­‐channel="tweets"	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  output-­‐channel="tech-­‐tweets"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  discard-­‐channel="discarded-­‐tweets"	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ref="techTweetSelector"	
  />	
  
public	
  class	
  LinkTweetSelector	
  implements	
  MessageSelector	
  {	
  
	
  public	
  boolean	
  accept(Message<?>	
  message)	
  {	
  
	
  	
   	
  	
  	
  	
  for	
  (String	
  word	
  :	
  message.getPayload().split("	
  "))	
  {	
  
	
   	
   	
  if	
  (word.startsWith("http://"))	
  {	
  return	
  true;	
  }	
  
	
   	
  }	
  
	
  	
  	
  	
  	
  return	
  false;	
  
}}	
  
Content Enricher
Apenas mensagens com links
estão neste canal
Adiciona um cabeçalho para
rotular as mensagens
por assunto (“java” ou “other”)
sender: usuario
subject: assunto
outros headers: …
Payload:
texto da mensagem
Content Enrichers!
•  Header ou Payload!
<bean	
  id="tweetTagger"	
  	
  
	
  	
  	
  	
  	
  	
  class="br.com.argonavis.si.examples.tdc.TweetSubjectTagger"	
  />	
  
	
  
<int:header-­‐enricher	
  input-­‐channel="tech-­‐tweets"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  output-­‐channel="tagged-­‐tweets">	
  
	
  	
  	
  	
  	
  <int:header	
  name="subject"	
  method="setSubjectHeader"	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ref="tweetTagger"	
  />	
  
</int:header-­‐enricher>	
  
public	
  class	
  TweetSubjectTagger	
  {	
  
	
  	
  	
  	
  public	
  String	
  setSubjectHeader(String	
  payload)	
  {	
  
	
  	
  	
  	
   	
  if(payload.toLowerCase().indexOf("java")	
  >=	
  0)	
  {	
  
	
  	
  	
  	
   	
   	
  return	
  "java";	
  
	
  	
  	
  	
   	
  }	
  else	
  {	
  
	
  	
  	
  	
   	
   	
  return	
  "other";	
  //	
  web	
  
	
  	
  	
  	
   	
  }	
  
	
  	
  	
  	
  }	
  
}	
  
Elementos <header> também

podem passar valores fixos!
Método do bean !
fornece o valor!
do header!
Message Translator
sender: usuario
subject: assunto
outros headers: …
Payload:
texto da mensagem
Transforma o texto em fragmento HTML
(links em <a href>, hashtags em <span>, etc.
Palestra de @helderdarocha sobre
EIP patterns e SpringIntegration
#TheDevConf https://pic.twitter.com/
eIcFIYAo8T
<div class="tweet"><span class="sender">usuario</span>Palestra de
<span class="user">@helderdarocha</span> sobre EIP patterns e
SpringIntegration <span class="hashtag”>#TheDevConf</span> <a
href="https://pic.twitter.com/eIcFIYAo8T”>https://pic.twitter.com/
eIcFIYAo8T</a></div>
sender: usuario
subject: assunto
outros headers: …
Payload:
<div>html da
mensagem</div>
Message Translator 2!
<bean	
  id="htmlDecoratorTransformer"	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  class="br.com.argonavis.si.examples.tdc.HtmlDecoratorTransformer"	
  />	
  
	
  
<int:transformer	
  input-­‐channel="tagged-­‐tweets"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  output-­‐channel="decorated-­‐tweets"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ref="htmlDecoratorTransformer"	
  />	
  
public	
  class	
  HtmlDecoratorTransformer	
  implements	
  Transformer	
  {	
  
	
  
	
  	
  	
  public	
  Message<?>	
  transform(Message<?>	
  msg)	
  {	
  
	
  	
  	
  	
  	
  	
  String	
  newPayload	
  =	
  /*	
  several	
  transformations	
  */	
  
	
  	
  	
  	
  	
  	
  String	
  html	
  =	
  "<div	
  class='tweet'>"	
  +	
  newPayload	
  +	
  "</div>";	
  
	
  	
  	
  	
  	
  	
  return	
  MessageBuilder.withPayload(html)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  .copyHeaders(msg.getHeaders())	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  .build();	
  	
  
	
  	
  	
  }	
  
}	
  
Message Router
sender: usuario
subject: assunto
outros headers: …
Payload:
<div>html </div>
sender: usuario
subject: java
outros headers: …
Payload:
<div>html </div>
sender: usuario
subject: other
outros headers: …
Payload:
<div>html </div>
Arquivo
web/tweets/
JavaTweets.html
Arquivo
web/tweets/
OtherTweets.html
+ Outbound!
Channel

Adapter
Message Router!
•  Header Value Router mapeia valor de um cabeçalho
selecionado a diferentes canais!
•  Outbound Channel Adapters gravam no arquivo!
<int:header-­‐value-­‐router	
  input-­‐channel="decorated-­‐tweets"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  header-­‐name="subject">	
  
	
  	
  	
  	
  <int:mapping	
  value="java"	
  	
  channel="java-­‐tweets"	
  />	
  
	
  	
  	
  	
  <int:mapping	
  value="other"	
  channel="other-­‐tweets"	
  />	
  
</int:header-­‐value-­‐router>	
  
<int-­‐file:outbound-­‐channel-­‐adapter	
  
	
  	
  	
  	
  	
  	
  	
  channel="other-­‐tweets"	
  charset="UTF-­‐8"	
  mode="APPEND"	
  	
  
	
  	
  	
  	
  	
  	
  	
  directory="web-­‐document-­‐root/tweets"	
  
	
  	
  	
  	
  	
  	
  	
  filename-­‐generator-­‐expression="'OtherTweets.html'"	
  />	
  
<int-­‐file:outbound-­‐channel-­‐adapter	
  
	
  	
  	
  	
  	
  	
  	
  channel="java-­‐tweets"	
  charset="UTF-­‐8"	
  mode="APPEND"	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  directory="web-­‐document-­‐root/tweets"	
  
	
  	
  	
  	
  	
  	
  	
  filename-­‐generator-­‐expression="'JavaTweets.html'"	
  />	
  
Resultado
JavaTweets.html!
OtherTweets.html!
Ajax!
Outras formas de configurar!
•  Spring Integration também pode ser parcialmente ou totalmente configurado
via anotações em classes e métodos!
•  @Aggregator, @Filter, @Router, @ServiceActivator, @Transformer,
@InboundChannelAdapter, etc.!
public	
  class	
  Servico	
  {	
  
	
  	
  	
  @ServiceActivator(inputChannel="entrada",	
  outputChannel="saida”)	
  
	
  	
  	
  public	
  void	
  metodo(String	
  payload,	
  @Headers	
  Map<String,	
  Object>	
  head)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  …	
  
	
  	
  	
  }	
  
}	
  
•  As rotas, desde Spring Integration 4.0, podem ser expressas em Java DSL,
que as torna mais legíveis!
@Bean	
  public	
  IntegrationFlow	
  splitAggregateFlow()	
  {	
  
	
  	
  	
  	
  return	
  IntegrationFlows.from("tweets”)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  .split(null).channel(MessageChannels.executor(this.taskExecutor()))	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  .resequence().aggregate().get();	
  
}	
  
•  Camel normalmente declara rotas usando DSLs (não apenas Java)!
Camel ou Spring
Integration?!
•  Resposta baseada em opinião
•  Ambos implementam bem vários padrões EIP e possuem
gateways e adapters para muitos serviços!
•  Se você já usa a plataforma Spring, pode usar Camel (com
Spring) ou Spring Integration (se preferir)!
•  Se usa Spring XD, SI é melhor pois XD é construído sobre SI!
•  Se não usa Spring, Camel é uma alternativa melhor (mais fácil
de aprender, flexível e completa – não deve nada ao SI)!
•  Se tem um projeto SI e prefere usar Camel, existe uma Ponte
Camel – Spring-Integration (https://camel.apache.org/springintegration.html)!
Conclusões!
•  Esta palestra apresentou uma introdução a padrões
de integração de sistemas e Spring Integration!
•  Uma visão geral dos padrões de destacando os
principais!
•  Uma possível solução teórica usando padrões para
um problema de integração!
•  Uma implementação da solução em Java usando
Spring Integration!
•  Breve discussão sobre outros recursos e alternativas a
Spring Integration!
Referências!
•  Gregor Hohpe, Bobby Woolf, et al Enterprise
Integration Patterns http://www.eaipatterns.com/
•  Spring Integration http://projects.spring.io/spring-integration/
•  Kai Waehner. Integration Framework Comparison –
Spring Integration, Mule ESB or Apache Camel!
http://www.javacodegeeks.com/2012/03/integration-framework-comparison-
spring.html
•  Jim White. Spring Integration Tutorial. Intertech, 2014. !
http://www.intertech.com/Blog/spring-integration-part-1-understanding-channels/
Ótimo tutorial passo-a-passo sobre Spring Integration!
obrigado!!
helder@argonavis.com.br	
  
2015
2015
Palestra!
http://www.argonavis.com.br/download/tdc_2015_eip-si.html
!
Código-fonte!
https://github.com/argonavisbr/SpringIntegrationExamples

Mais conteúdo relacionado

Mais procurados

Mainframe Modernization with Precisely and Microsoft Azure
Mainframe Modernization with Precisely and Microsoft AzureMainframe Modernization with Precisely and Microsoft Azure
Mainframe Modernization with Precisely and Microsoft AzurePrecisely
 
Cost Effective Rendering in the Cloud with Spot Instances
Cost Effective Rendering in the Cloud with Spot InstancesCost Effective Rendering in the Cloud with Spot Instances
Cost Effective Rendering in the Cloud with Spot InstancesAmazon Web Services
 
An Agile Approach to Accelerate Mass Migration | AWS Public Sector Summit 2016
An Agile Approach to Accelerate Mass Migration | AWS Public Sector Summit 2016An Agile Approach to Accelerate Mass Migration | AWS Public Sector Summit 2016
An Agile Approach to Accelerate Mass Migration | AWS Public Sector Summit 2016Amazon Web Services
 
Messaging with RabbitMQ and AMQP
Messaging with RabbitMQ and AMQPMessaging with RabbitMQ and AMQP
Messaging with RabbitMQ and AMQPEberhard Wolff
 
AWS Foundational and Platform Services - Module 1 Parts 2 & 3 - AWSome Day 2017
AWS Foundational and Platform Services - Module 1 Parts 2 & 3 - AWSome Day 2017AWS Foundational and Platform Services - Module 1 Parts 2 & 3 - AWSome Day 2017
AWS Foundational and Platform Services - Module 1 Parts 2 & 3 - AWSome Day 2017Amazon Web Services
 
Introduction to Enterprise Service Bus
Introduction to Enterprise Service BusIntroduction to Enterprise Service Bus
Introduction to Enterprise Service BusMahmoud Ezzat
 
Enteprise Integration Patterns
Enteprise Integration PatternsEnteprise Integration Patterns
Enteprise Integration PatternsAlessandro Kieras
 
Application Architecture: The Next Wave | MuleSoft
Application Architecture: The Next Wave | MuleSoftApplication Architecture: The Next Wave | MuleSoft
Application Architecture: The Next Wave | MuleSoftMuleSoft
 
Is 12 Factor App Right About Logging
Is 12 Factor App Right About LoggingIs 12 Factor App Right About Logging
Is 12 Factor App Right About LoggingPhil Wilkins
 
Whats New in Integration What's New in IBM Integration Bus and IIB on Cloud
Whats New in Integration What's New in IBM Integration Bus and IIB on Cloud Whats New in Integration What's New in IBM Integration Bus and IIB on Cloud
Whats New in Integration What's New in IBM Integration Bus and IIB on Cloud Rob Convery
 
Semantik web 43slayt
Semantik web 43slaytSemantik web 43slayt
Semantik web 43slaytmuratgulenc
 
고객 경험을 통한 AWS 클라우드 이전을 위한 지름길 - 김효정 (AWS 솔루션즈 아키텍트)
고객 경험을 통한 AWS 클라우드 이전을 위한 지름길 - 김효정 (AWS 솔루션즈 아키텍트)고객 경험을 통한 AWS 클라우드 이전을 위한 지름길 - 김효정 (AWS 솔루션즈 아키텍트)
고객 경험을 통한 AWS 클라우드 이전을 위한 지름길 - 김효정 (AWS 솔루션즈 아키텍트)Amazon Web Services Korea
 
Neo4j & AWS Bedrock workshop at GraphSummit London 14 Nov 2023.pptx
Neo4j & AWS Bedrock workshop at GraphSummit London 14 Nov 2023.pptxNeo4j & AWS Bedrock workshop at GraphSummit London 14 Nov 2023.pptx
Neo4j & AWS Bedrock workshop at GraphSummit London 14 Nov 2023.pptxNeo4j
 
AWS Enterprise First Call Deck
AWS Enterprise First Call DeckAWS Enterprise First Call Deck
AWS Enterprise First Call DeckAlexandre Melo
 
Migrating the media supply chain to the AWS cloud
Migrating the media supply chain to the AWS cloud Migrating the media supply chain to the AWS cloud
Migrating the media supply chain to the AWS cloud Amazon Web Services
 
Costruire Applicazioni Moderne con AWS
Costruire Applicazioni Moderne con AWSCostruire Applicazioni Moderne con AWS
Costruire Applicazioni Moderne con AWSAmazon Web Services
 
Building and Successfully Selling ISV Solutions with AWS Partner-Summit-Singa...
Building and Successfully Selling ISV Solutions with AWS Partner-Summit-Singa...Building and Successfully Selling ISV Solutions with AWS Partner-Summit-Singa...
Building and Successfully Selling ISV Solutions with AWS Partner-Summit-Singa...Amazon Web Services
 
[AWS Techshift] 파트너 사업을 준비하기 위해 기억해야 할 5가지 - 양승호, AWS 파트너 사업 개발 담당 이사
[AWS Techshift] 파트너 사업을 준비하기 위해 기억해야 할 5가지 - 양승호, AWS 파트너 사업 개발 담당 이사[AWS Techshift] 파트너 사업을 준비하기 위해 기억해야 할 5가지 - 양승호, AWS 파트너 사업 개발 담당 이사
[AWS Techshift] 파트너 사업을 준비하기 위해 기억해야 할 5가지 - 양승호, AWS 파트너 사업 개발 담당 이사Amazon Web Services Korea
 

Mais procurados (20)

Mainframe Modernization with Precisely and Microsoft Azure
Mainframe Modernization with Precisely and Microsoft AzureMainframe Modernization with Precisely and Microsoft Azure
Mainframe Modernization with Precisely and Microsoft Azure
 
Cost Effective Rendering in the Cloud with Spot Instances
Cost Effective Rendering in the Cloud with Spot InstancesCost Effective Rendering in the Cloud with Spot Instances
Cost Effective Rendering in the Cloud with Spot Instances
 
An Agile Approach to Accelerate Mass Migration | AWS Public Sector Summit 2016
An Agile Approach to Accelerate Mass Migration | AWS Public Sector Summit 2016An Agile Approach to Accelerate Mass Migration | AWS Public Sector Summit 2016
An Agile Approach to Accelerate Mass Migration | AWS Public Sector Summit 2016
 
Messaging with RabbitMQ and AMQP
Messaging with RabbitMQ and AMQPMessaging with RabbitMQ and AMQP
Messaging with RabbitMQ and AMQP
 
AWS Foundational and Platform Services - Module 1 Parts 2 & 3 - AWSome Day 2017
AWS Foundational and Platform Services - Module 1 Parts 2 & 3 - AWSome Day 2017AWS Foundational and Platform Services - Module 1 Parts 2 & 3 - AWSome Day 2017
AWS Foundational and Platform Services - Module 1 Parts 2 & 3 - AWSome Day 2017
 
Introduction to Enterprise Service Bus
Introduction to Enterprise Service BusIntroduction to Enterprise Service Bus
Introduction to Enterprise Service Bus
 
Enteprise Integration Patterns
Enteprise Integration PatternsEnteprise Integration Patterns
Enteprise Integration Patterns
 
Application Architecture: The Next Wave | MuleSoft
Application Architecture: The Next Wave | MuleSoftApplication Architecture: The Next Wave | MuleSoft
Application Architecture: The Next Wave | MuleSoft
 
Is 12 Factor App Right About Logging
Is 12 Factor App Right About LoggingIs 12 Factor App Right About Logging
Is 12 Factor App Right About Logging
 
Whats New in Integration What's New in IBM Integration Bus and IIB on Cloud
Whats New in Integration What's New in IBM Integration Bus and IIB on Cloud Whats New in Integration What's New in IBM Integration Bus and IIB on Cloud
Whats New in Integration What's New in IBM Integration Bus and IIB on Cloud
 
Semantik web 43slayt
Semantik web 43slaytSemantik web 43slayt
Semantik web 43slayt
 
고객 경험을 통한 AWS 클라우드 이전을 위한 지름길 - 김효정 (AWS 솔루션즈 아키텍트)
고객 경험을 통한 AWS 클라우드 이전을 위한 지름길 - 김효정 (AWS 솔루션즈 아키텍트)고객 경험을 통한 AWS 클라우드 이전을 위한 지름길 - 김효정 (AWS 솔루션즈 아키텍트)
고객 경험을 통한 AWS 클라우드 이전을 위한 지름길 - 김효정 (AWS 솔루션즈 아키텍트)
 
Neo4j & AWS Bedrock workshop at GraphSummit London 14 Nov 2023.pptx
Neo4j & AWS Bedrock workshop at GraphSummit London 14 Nov 2023.pptxNeo4j & AWS Bedrock workshop at GraphSummit London 14 Nov 2023.pptx
Neo4j & AWS Bedrock workshop at GraphSummit London 14 Nov 2023.pptx
 
AWS Enterprise First Call Deck
AWS Enterprise First Call DeckAWS Enterprise First Call Deck
AWS Enterprise First Call Deck
 
Migrating the media supply chain to the AWS cloud
Migrating the media supply chain to the AWS cloud Migrating the media supply chain to the AWS cloud
Migrating the media supply chain to the AWS cloud
 
Costruire Applicazioni Moderne con AWS
Costruire Applicazioni Moderne con AWSCostruire Applicazioni Moderne con AWS
Costruire Applicazioni Moderne con AWS
 
Building and Successfully Selling ISV Solutions with AWS Partner-Summit-Singa...
Building and Successfully Selling ISV Solutions with AWS Partner-Summit-Singa...Building and Successfully Selling ISV Solutions with AWS Partner-Summit-Singa...
Building and Successfully Selling ISV Solutions with AWS Partner-Summit-Singa...
 
TCO e otimização de custos na AWS
TCO e otimização de custos na AWSTCO e otimização de custos na AWS
TCO e otimização de custos na AWS
 
[AWS Techshift] 파트너 사업을 준비하기 위해 기억해야 할 5가지 - 양승호, AWS 파트너 사업 개발 담당 이사
[AWS Techshift] 파트너 사업을 준비하기 위해 기억해야 할 5가지 - 양승호, AWS 파트너 사업 개발 담당 이사[AWS Techshift] 파트너 사업을 준비하기 위해 기억해야 할 5가지 - 양승호, AWS 파트너 사업 개발 담당 이사
[AWS Techshift] 파트너 사업을 준비하기 위해 기억해야 할 5가지 - 양승호, AWS 파트너 사업 개발 담당 이사
 
Aula 05 - Java Script Básico
Aula 05 -  Java Script BásicoAula 05 -  Java Script Básico
Aula 05 - Java Script Básico
 

Semelhante a Padrões de Integração de Sistemas com Spring Integration

15 padrões de mensageria para integração de sistemas
15 padrões de mensageria para integração de sistemas15 padrões de mensageria para integração de sistemas
15 padrões de mensageria para integração de sistemasHelder da Rocha
 
TDC2017 | POA Trilha Arquitetura - 15 padrões essenciais de mensageria para i...
TDC2017 | POA Trilha Arquitetura - 15 padrões essenciais de mensageria para i...TDC2017 | POA Trilha Arquitetura - 15 padrões essenciais de mensageria para i...
TDC2017 | POA Trilha Arquitetura - 15 padrões essenciais de mensageria para i...tdc-globalcode
 
Aula 1 - Programação Dinâmica para Web
Aula 1 - Programação Dinâmica para WebAula 1 - Programação Dinâmica para Web
Aula 1 - Programação Dinâmica para WebDaniel Brandão
 
201406Carvalho
201406Carvalho201406Carvalho
201406CarvalhoAfonso Pra
 
JustJava 2005: Web Services em Java com o JWSDP 1.5
JustJava 2005: Web Services em Java com o JWSDP 1.5JustJava 2005: Web Services em Java com o JWSDP 1.5
JustJava 2005: Web Services em Java com o JWSDP 1.5Helder da Rocha
 
Elastic @ The Ministry of Health/Datasus (P)
Elastic @ The Ministry of Health/Datasus (P)Elastic @ The Ministry of Health/Datasus (P)
Elastic @ The Ministry of Health/Datasus (P)Elasticsearch
 
JBoss Fuse Service Works - O Fuse além da integração - PT-BR
JBoss Fuse Service Works - O Fuse além da integração - PT-BRJBoss Fuse Service Works - O Fuse além da integração - PT-BR
JBoss Fuse Service Works - O Fuse além da integração - PT-BRElvis Rocha
 
ExpressoBR para Um Milhão (de Usuários)
ExpressoBR para Um Milhão (de Usuários)ExpressoBR para Um Milhão (de Usuários)
ExpressoBR para Um Milhão (de Usuários)Flávio Lisboa
 
Tdc 2013 eric lemes - integracoes entre sistemas-2
Tdc 2013   eric lemes - integracoes entre sistemas-2Tdc 2013   eric lemes - integracoes entre sistemas-2
Tdc 2013 eric lemes - integracoes entre sistemas-2Eric Lemes
 
ACII - SL07 - Introducao aos sistemas distribuidos
ACII - SL07 - Introducao aos sistemas distribuidosACII - SL07 - Introducao aos sistemas distribuidos
ACII - SL07 - Introducao aos sistemas distribuidosUFPB
 
Docker no Back e no Front - um exemplo com .NET Core e Angular - Campus Party...
Docker no Back e no Front - um exemplo com .NET Core e Angular - Campus Party...Docker no Back e no Front - um exemplo com .NET Core e Angular - Campus Party...
Docker no Back e no Front - um exemplo com .NET Core e Angular - Campus Party...Renato Groff
 
Php Conf08 Enterprise Patterns
Php Conf08 Enterprise PatternsPhp Conf08 Enterprise Patterns
Php Conf08 Enterprise PatternsWildtech
 

Semelhante a Padrões de Integração de Sistemas com Spring Integration (20)

15 padrões de mensageria para integração de sistemas
15 padrões de mensageria para integração de sistemas15 padrões de mensageria para integração de sistemas
15 padrões de mensageria para integração de sistemas
 
TDC2017 | POA Trilha Arquitetura - 15 padrões essenciais de mensageria para i...
TDC2017 | POA Trilha Arquitetura - 15 padrões essenciais de mensageria para i...TDC2017 | POA Trilha Arquitetura - 15 padrões essenciais de mensageria para i...
TDC2017 | POA Trilha Arquitetura - 15 padrões essenciais de mensageria para i...
 
Servidores de Aplicações
Servidores de AplicaçõesServidores de Aplicações
Servidores de Aplicações
 
Hornet - 1.Conceitos de Mensageria
Hornet - 1.Conceitos de MensageriaHornet - 1.Conceitos de Mensageria
Hornet - 1.Conceitos de Mensageria
 
Tutorial esb (aulas praticas)
Tutorial esb (aulas praticas)Tutorial esb (aulas praticas)
Tutorial esb (aulas praticas)
 
Escalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLIDEscalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLID
 
Aula 1 - Programação Dinâmica para Web
Aula 1 - Programação Dinâmica para WebAula 1 - Programação Dinâmica para Web
Aula 1 - Programação Dinâmica para Web
 
201406Carvalho
201406Carvalho201406Carvalho
201406Carvalho
 
JustJava 2005: Web Services em Java com o JWSDP 1.5
JustJava 2005: Web Services em Java com o JWSDP 1.5JustJava 2005: Web Services em Java com o JWSDP 1.5
JustJava 2005: Web Services em Java com o JWSDP 1.5
 
Modelo de Referência OSI
Modelo de Referência OSIModelo de Referência OSI
Modelo de Referência OSI
 
Elastic @ The Ministry of Health/Datasus (P)
Elastic @ The Ministry of Health/Datasus (P)Elastic @ The Ministry of Health/Datasus (P)
Elastic @ The Ministry of Health/Datasus (P)
 
JBoss Fuse Service Works - O Fuse além da integração - PT-BR
JBoss Fuse Service Works - O Fuse além da integração - PT-BRJBoss Fuse Service Works - O Fuse além da integração - PT-BR
JBoss Fuse Service Works - O Fuse além da integração - PT-BR
 
01 aula1 habib
01 aula1 habib01 aula1 habib
01 aula1 habib
 
ExpressoBR para Um Milhão (de Usuários)
ExpressoBR para Um Milhão (de Usuários)ExpressoBR para Um Milhão (de Usuários)
ExpressoBR para Um Milhão (de Usuários)
 
Tdc 2013 eric lemes - integracoes entre sistemas-2
Tdc 2013   eric lemes - integracoes entre sistemas-2Tdc 2013   eric lemes - integracoes entre sistemas-2
Tdc 2013 eric lemes - integracoes entre sistemas-2
 
ACII - SL07 - Introducao aos sistemas distribuidos
ACII - SL07 - Introducao aos sistemas distribuidosACII - SL07 - Introducao aos sistemas distribuidos
ACII - SL07 - Introducao aos sistemas distribuidos
 
Ruby on Rails for beginners 2.0
Ruby on Rails for beginners 2.0Ruby on Rails for beginners 2.0
Ruby on Rails for beginners 2.0
 
O modelo osi
O modelo osiO modelo osi
O modelo osi
 
Docker no Back e no Front - um exemplo com .NET Core e Angular - Campus Party...
Docker no Back e no Front - um exemplo com .NET Core e Angular - Campus Party...Docker no Back e no Front - um exemplo com .NET Core e Angular - Campus Party...
Docker no Back e no Front - um exemplo com .NET Core e Angular - Campus Party...
 
Php Conf08 Enterprise Patterns
Php Conf08 Enterprise PatternsPhp Conf08 Enterprise Patterns
Php Conf08 Enterprise Patterns
 

Mais de Helder da Rocha

Como criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.jsComo criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.jsHelder da Rocha
 
Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)Helder da Rocha
 
TDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativosTDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativosHelder da Rocha
 
Visualização de dados e a Web
Visualização de dados e a WebVisualização de dados e a Web
Visualização de dados e a WebHelder da Rocha
 
Eletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativosEletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativosHelder da Rocha
 
Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)Helder da Rocha
 
API de segurança do Java EE 8
API de segurança do Java EE 8API de segurança do Java EE 8
API de segurança do Java EE 8Helder da Rocha
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Helder da Rocha
 
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)Helder da Rocha
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)Helder da Rocha
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Helder da Rocha
 
Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Helder da Rocha
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Helder da Rocha
 
Atualização Java 8 (2014)
Atualização Java 8 (2014)Atualização Java 8 (2014)
Atualização Java 8 (2014)Helder da Rocha
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsHelder da Rocha
 
Threads 07: Sincronizadores
Threads 07: SincronizadoresThreads 07: Sincronizadores
Threads 07: SincronizadoresHelder da Rocha
 
Threads 08: Executores e Futures
Threads 08: Executores e FuturesThreads 08: Executores e Futures
Threads 08: Executores e FuturesHelder da Rocha
 

Mais de Helder da Rocha (20)

Como criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.jsComo criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.js
 
Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)
 
TDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativosTDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativos
 
Visualização de dados e a Web
Visualização de dados e a WebVisualização de dados e a Web
Visualização de dados e a Web
 
Eletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativosEletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativos
 
Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)
 
API de segurança do Java EE 8
API de segurança do Java EE 8API de segurança do Java EE 8
API de segurança do Java EE 8
 
Java 9, 10, 11
Java 9, 10, 11Java 9, 10, 11
Java 9, 10, 11
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)
 
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
 
Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)
 
Curso de Java: Threads
Curso de Java: ThreadsCurso de Java: Threads
Curso de Java: Threads
 
Atualização Java 8 (2014)
Atualização Java 8 (2014)Atualização Java 8 (2014)
Atualização Java 8 (2014)
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e Streams
 
Threads 07: Sincronizadores
Threads 07: SincronizadoresThreads 07: Sincronizadores
Threads 07: Sincronizadores
 
Threads 09: Paralelismo
Threads 09: ParalelismoThreads 09: Paralelismo
Threads 09: Paralelismo
 
Threads 08: Executores e Futures
Threads 08: Executores e FuturesThreads 08: Executores e Futures
Threads 08: Executores e Futures
 

Padrões de Integração de Sistemas com Spring Integration

  • 1. spring integration padrões de! integração de sistemas! com! Julho/2015 helderdarocha! helder@argonavis.com.br 4.0
  • 2. Conteúdo! 1.  Padrões de Integração de Sistemas (EIP)! Overview e principais componentes! 2.  Um problema de integração! Solução teórica do problema usando EIP! 3.  Spring Integration! Solução prática do problema com Spring Integration! 4.  Alternativas!
  • 3. Quem sou? Who am I? Кто я?! Helder da Rocha! tecnologia + ciência + arte! Java desde 1995! Web, XML, Design! + de 2500 alunos ! + de 8000 horas de aula! argonavis.com.br! helderdarocha.com.br! argonavis.com.br
  • 4. Por que integrar?! •  Aplicações interessantes raramente vivem isoladas •  Sincronizar emails, calendários, etc.! •  Vincular portal a um aplicativo de controle de estoque! •  Integrar com serviços e dados na nuvem! •  Evitar reinventar a roda! •  Reusar serviços que funcionam bem! •  Pontos de integração existem! •  Com integração aplicações podem ficar melhores
  • 5. Desafios das soluções de integração! Redes não são confiáveis Redes são lentas Aplicações são diferentes Aplicações mudam Soluções são complexas
  • 6. Estratégias(estilos) de integração Transferência e Arquivos (1)! Banco de Dados Compartilhado (2)! RPC (3)! Mensageria (4) !
  • 7. Métodos de comunicação! Assíncrono: cliente chama o serviço e não espera a operação terminar Mensageria! Síncrono: cliente chama o serviço e espera pelo
 fim da execução da operação RPC!
  • 8. O que é mensageria?! •  Comunicação entre máquinas! •  Através de mensagens enviados em canais (filas) compartilhados entre as máquinas! •  Remetente, produtor de mensagens! •  Destinatário, consumidor de mensagens! •  Mensagem! •  Estrutura de dados (objeto, string, tipo, bytes)! •  Cabeçalho, metadados! •  Corpo, payload
  • 9. O que é um sistema de mensageria?! •  Message Oriented Middleware! •  Mediator pattern (GoF) entre consumidores e produtores! •  Administra o sistema (canais e conexões)! •  Etapas! •  Criar – produtor cria a mensagem e preenche com dados! •  Enviar – produtor adiciona mensagem a um canal! •  Entregar – sistema de mensageria transfere a mensagem de uma máquina para a outra tornando-a disponível ao consumidor! •  Receber – consumidor lê a mensagem do canal! •  Processar – consumidor extrai os dados da mensagem!
  • 10. Padrões de design! •  Abstração de alto nível! •  Nome / Icone! •  Contexto! •  Problema / Solução / Exemplo! •  Vocabulário! •  Notação! •  Padrões relacionados! •  Conseqüências da aplicação do padrão!
  • 11. Padrões de integração! •  65 padrões de integração de sistemas! •  Aplicações em Java, .NET e outras plataformas! •  62 focam em soluções de mensageria! •  Foco: minimizar o acoplamento entre componentes!
  • 12. Padrões de Mensageria (4)! (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) Mensageria
 (Messaging) Canal de 
 Mensagens (Message Channel) Mensagem (Message) Dutos e 
 Filtros (Pipes and Filters) Roteador 
 de Mensagens (Message Router) Tradutor de 
 Mensagens (Message Translator) Terminal de 
 Mensagens (Message Endpoint)
  • 13. Arquitetura dutos e filtros •  Padrão de arquitetura (PEAA*)! •  Representa a conexão de componentes (filtros), em série, através de dutos (canais) que os conectam! •  Decorator (GoF**) e Intercepting Filter (PEAA)! •  Em vez de enviar a mensagem diretamente ao destinatário, pode-se interceptá-la em etapas intermediárias para validação do seu conteúdo, roteamento, transformação de dados, etc. ! •  Cada componente age como filtro; cada canal age como duto.! •  Processamento pipeline; paralelismo! Fonte: eaipatterns.com
  • 14. Message Channel! PROBLEMA “Como pode uma aplicação comunicar-se com outra aplicação usando mensageria?” SOLUÇÃO “Conectar as aplicações usando um Canal de Mensagens (Message Channel), onde uma aplicação grava informação no canal e a outra lê do canal.” Fonte: eaipatterns.com
  • 15. Message! PROBLEMA “Como é que duas aplicações conectadas por um canal de mensagens podem trocar informação?” SOLUÇÃO “Empacote a informação dentro de uma Mensagem (Message), um registro de dados que o sistema de mensageria pode transmitir através de um canal de mensagens.”
  • 16. Message Endpoint! PROBLEMA “Como pode uma aplicação conectar-se a um canal de mensageria para enviar e receber mensagens?” SOLUÇÃO “Conecte uma aplicaçao a um canal de mensageria usando um Terminal de Mensagens (Message Endpoint), um cliente do sistema de mensageria que a aplicação pode usar para enviar ou receber mensagens.” Imagens: eaipatterns.com
  • 17. Message Router! PROBLEMA “Como desacoplar passos individuais de processamento de forma que mensagens possam ser passadas para diferentes filtros dependendo de uma série de condições?” SOLUÇÃO “Use um filtro especial, um Roteador de Mensagens (Message Router) que consome uma Mensagem de um Canal de Mensagens e publique-a em outro Canal de Mensagens, dependendo de uma série de condições.” ! Imagens: eaipatterns.com
  • 18. Message Translator! PROBLEMA “Como é possível realizar a comunicação usando mensageria, entre sistemas que usam formatos de dados diferentes?” SOLUÇÃO “Use um filtro especial, um Tradutor de Mensagens (Message Translator), entre outros filtros ou aplicações para traduzir de um formato de dados para outro.” Imagens: eaipatterns.com
  • 19. Padrões de Canal de Mensagens (5)! (4) (11) (12) (13) (14) canal mensageria (5) (15) (16) (17) (18) (19) canal
 ponto-a-
 ponto canal
 publicar-
 assinar canal
 tipo-de
 dados canal
 mensagens
 inválidas canal
 mensagens
 não-entregues entrega
 garantida ponte de
 mensageria adaptador
 de canal barramento
  • 20. Point-to-point channel! PROBLEMA “Como o remetente pode ter certeza que apenas um destinatário irá receber a mensagem ou executar um comando?” SOLUÇÃO “Envie a mensagem através de um Canal Ponto- a-Ponto, que garante que apenas um destinatário irá receber a mensagem.” Imagens: eaipatterns.com
  • 21. Publish-subscribe channel! PROBLEMA “Como pode um remetente transmitir um evento a todos os destinatários interessados?” SOLUÇÃO “Envie o evento para um Canal Publicar-Inscrever, que entrega uma cópia do evento a cada destinatário.” Imagens: eaipatterns.com
  • 22. Channel Adapter! PROBLEMA “Como conectar uma aplicação ao sistema de messaging para que ela possa enviar e receber mensagens?” SOLUÇÃO “Use um Channel Adapter que pode acessar a API da aplicação ou seus dados, e publique mensagens em um canal baseado nesses dados, e que possa receber mensagens e chamar funcionalidades dentro da aplicação” Imagens: eaipatterns.com
  • 23. Padrões de Construção de Mensagens (6) ! Formato! (4) (20) (21) (22) (23) mensagem mensageria (6) (24) (25) (26) (27) (28) mensagem
 comando mensagem
 documento mensagem
 evento requisição
 resposta endereço resposta ID de
 correlação sequência prazo de
 validade indicador
 de formato
  • 24. Request-Reply! PROBLEMA “Quando uma aplicação envia uma mensagem, como ela pode obter uma resposta do servidor?” SOLUÇÃO “Envie um par de mensagens Requisição- Resposta, cada uma no seu próprio canal” Imagens: eaipatterns.com
  • 25. Padrões de Roteamento de Mensagens (8) ! Scatter! Gather! (7) processador composto dutos e filtros (4) (30) (29) (34) (31) (33) (36) roteador mensageria (8) (35) (32) (39) (37) (38) (40) corretor de 
 mensagens gerente de 
 processos lista de
 circulação espalha-
 recolhe Roteadores simples Roteadores compostos Arquitetura roteador baseado
 em conteúdo divisor filtro roteador
 dinâmico agregador re-sequenciador lista de
 destinatários
  • 26. Content-Based Router! PROBLEMA “Como lidar com a situação onde a implementação de uma única função lógica está espalhada por múltiplos sistemas físicos?” SOLUÇÃO “Use um Roteador Baseado em Conteúdo para rotear cada mensagem para o receptor correto baseado no conteúdo da mensagem” Imagens: eaipatterns.com
  • 27. Recipient List! PROBLEMA “Como rotear uma mensagem para uma lista de receptores especificados dinamicamente?” SOLUÇÃO “Defina um canal para cada receptor. Depois use uma Lista de Destinatários para inspecionar uma mensagem entrante, determine a lista de receptores desejados, e repasse a mensagem para todos os canais associados com os receptores da lista.” Imagens: eaipatterns.com
  • 29. Message Filter! PROBLEMA “Como um componente pode evitar o recebimento de mensagens que não interessam?” SOLUÇÃO “Use um tipo especial de roteador, um Filtro de Mensagens, para eliminar mensagens indesejadas de um canal com base em um conjunto de critérios.” Imagens: eaipatterns.com
  • 30. Padrões relacionados a Message Translator (9) ! (4) (41) (42) (43) (44) (45) (46) tradutor empacotador de envelope enriquecedor
 de conteúdo filtro
 de conteúdo recibo de
 bagagem normalizador modelo de
 dados
 canônico mensageria (9)
  • 31. Content Enricher / Filter! Imagens: eaipatterns.com
  • 32. Claim Check! PROBLEMA “Como podemos reduzir o volume de dados de uma mensagem enviada através do sistema sem sacrificar o conteúdo da informação?” SOLUÇÃO “Guarde os dados da mensagem em um repositório persistente e passe um Recibo de Bagagem para os componentes seguintes. Esses componentes poderão usar o Recibo para recuperar a informação armazenada” Imagens: eaipatterns.com
  • 33. Padrões para Terminais de Mensageria (10)! consumidor
 seletivo gateway de
 mensageria ativador de serviço consumidores concorrentes (4) (47) (48) (49) (50) (51) (57) terminal mensageria (10) (52) (53) (54) (55) (56) mapeador de
 mensageria cliente
 transacional consumidor
 de sondagem consumidor
 ativado por evento despachante
 de mensagens assinante
 durável receptor
 idempotente Envio/Recebimento Consumidores (endpoint)
  • 34. Messaging Gateway! PROBLEMA “Como isolar o acesso ao sistema de mensageria do restante da aplicação?” SOLUÇÃO “Use um Gateway de Mensageria, uma classe que encapsula chamadas especificas ao sistema de mensageria e expõe uma interface com métodos específicos ao domínio da aplicação” Imagens: eaipatterns.com
  • 35. Service Activator! PROBLEMA “Como projetar um serviço que possa ser chamado de forma síncrona (sem usar mensageria) ou de forma assíncrona (usando tecnologias de mensageria)?” SOLUÇÃO “Projete um Ativador de Serviços que conecte as mensagens do canal ao serviço” Imagens: eaipatterns.com
  • 36. Padrões de Gerenciamento do Sistema! Control Bus (Barramento de Controle) (58)! Detour (Desvio) (59)! Wire Tap (Escuta) (60)! Message History (Histórico de Mensagens) (61)! Message Store (Repositório de Mensagens) (62)! Smart Proxy (Proxy Inteligente) (63)! Test Message (Mensagem de Teste) (64)! Channel Purger (Purificador de Canal) (65)!
  • 37. Como usar os padrões?! •  Os padrões são abstrações de alto nível que permitem descrever a solução de um problema de integração! •  Use os padrões para descrever a arquitetura de rotas de uma solução de integração! •  Não há solução única para cada tipo de problema! •  Mesmos resultados podem ser alcançados com arquiteturas diferentes (+ conseqüências diferentes)! •  Exemplo: duas formas de filtrar mensagens! •  Predictive routing: Message Router com rotas pré-definidas! •  Reactive filtering: Canal Pub-Sub com Message Filter!
  • 38. Um problema de integração! •  Obter todas as mensagens com hashtag #TheDevConf ou #TDC2015 no Twitter, periodicamente (polling)! •  Processar apenas mensagens que tiverem links •  Estruturar o conteúdo das mensagens identificando hashtags, usuários, links e remetentes •  Separar mensagens que tratam de “Java” das demais mensagens! •  Disponibilizar (arquivo, Web, etc.) duas listas de mensagens (Java e outras)!
  • 39. Uma solução usando padrões! Channel! Adapter de entrada para Twitter! Extrair dados do Tweet e guardar em uma ! mensagem simples! Filtro para jogar fora mensagens que não têm links! Adicionar cabeçalho! com assunto da! mensagem! Converter mensagem em fragmento HTML! Separar mensagens! que falam sobre Java d as demais mensagens! Adaptadores de canal para streams, arquivos ou serviços Web!
  • 40. Como implementar?! •  Uma linguagem de programação (ex: Java) + um serviço de mensageria (ex: JMS + ActiveMQ)! •  Desvantagem: é preciso ter cuidado para componentes não ficarem excessivamente acoplados! •  Um framework que implemente padrões de integração de sistemas! •  Mule ESB! •  Apache Camel! •  Spring Integration!
  • 41. Spring Integration! •  Solução do Spring Framework / Spring IO! •  Integrado ao ecossistema do Spring! •  Configuração através de XML ou anotações •  Rotas em XML ou Java DSL
  • 42. Spring Framework! •  Spring é uma plataforma Java construída sobre conceitos injeção de dependências (DI) e aspectos! •  Componentes Spring (beans) são POJOs, vivem em um container e são interligados pelo framework usando DI •  O container inicializa um contexto que instancia e realiza as ligações (wiring) entre componentes ! •  A configuração é feita declarativamente usando defaults (wiring automático), XML e anotações! •  Exemplo de inicialização de contexto configurado em XML! ApplicationContext  ctx  =  new                              ClassPathXmlApplicationContext("beans.xml");    
  • 43. Exemplo de wiring em XML! <bean id="hibernateTemplate" class="org.springframework.orm. hibernate.HibernateTemplate"> <property name="sessionFactory” ref="sessionFactory"/> </property> </bean> <bean id="sessionFactory" class="org.springframework.orm. hibernate.LocalSessionFactoryBean"> ... </bean> <bean id="produtosDao" class="loja.ProdutosDao"> <property name="hibernateTemplate" ref="hibernateTemplate"/> </property> ... </bean> dataSource
  • 44. ApplicationContext! •  Através do contexto pode-se localizar e usar instâncias de beans (se for necessário)! ApplicationContext  ctx  =          new  ClassPathXmlApplicationContext("beans.xml");     ProdutosDao  bean  =  (ProdutosDao)                                                        ctx.getBean("produtosDao");   Produto  p  =  bean.findProduto(123);   BidDecimal  preco  =  p.getPreco();  
  • 46. Maven •  Os módulos Spring geralmente são incluídos em um projeto através do Maven ou Gradle!  <dependencies>      <dependency>        <groupId>org.springframework.integration</groupId>        <artifactId>spring-­‐integration</artifactId>        <version>4.0.4.RELEASE</version>      </dependency>      <dependency>        <groupId>org.springframework.integration</groupId>        <artifactId>spring-­‐integration-­‐twitter</artifactId>        <version>4.0.4.RELEASE</version>      </dependency>      <dependency>        <groupId>org.springframework.social</groupId>        <artifactId>spring-­‐social-­‐twitter</artifactId>        <version>1.1.0.RELEASE</version>      </dependency>    </dependencies>  
  • 47. Configuração do contexto! •  Para usar configuração declarativa XML também é necessário declarar XSD de componentes usados! <beans  xmlns="http://www.springframework.org/schema/beans”                xmlns:xsi="http://www.w3.org/2001/XMLSchema-­‐instance"                  xmlns:int="http://www.springframework.org/schema/integration"      xsi:schemaLocation="                          http://www.springframework.org/schema/integration                            http://www.springframework.org/schema/integration/                                                                                        spring-­‐integration-­‐4.0.xsd">            <bean  id="teste"  class="teste.Hello"  />          <int:channel  id="tweets"  />   </beans>  
  • 48. Ferramenta STS •  Spring Tool Suite (Eclipse)! •  Facilita desenvolvimento (ex: automaticamente cria arquivos de configuração e adiciona namespaces)!
  • 49. Solução usando SI! •  Para implementar a solução apresentada usando padrões EIP em Spring Integration usaremos! •  Um Inbound Channel Adapter para Twitter ! (spring-integration-twitter + spring-social-twitter)! •  Dois Outbound Channel Adapters para Arquivos ! (spring-integration-file)! •  Vários Message Channel <channel> •  Dois Message Translators <transformer> •  Um Content-Based Router <header-value-router> •  Um Content Enricher <header-enricher> •  Um Message Filter <filter>
  • 50. Inbound Channel Adapter “#TheDevConf  OR  #tdc2015”   Translator: Extrai dados de objeto Tweet e cria novo objeto Message Faz query no Twitter: Põe mensagens no canal raw-tweets sender: usuario outros headers: … Payload: texto da mensagem tweet.fromUser = usuario tweet.text: = texto da mensagem headers: … Payload: o.s…Tweet
  • 51. Canais do Spring Integration! MessageChannel! ! send(Message)! PollableChannel! ! receive(): Message! SubscribableChannel! ! subscribe(MessageHandler)! unsubscribe(MessageHandler)! DirectChannel! PublishSubscribeChannel! PriorityChannel! QueueChannel! RendezvousChannel! ExecutorChannel! <int:channel>! <int:publish-subscribe-channel>! <int:channel datatype=“type”>! <int:channel>! <int:queue/>! </int:channel>! <int:channel>! <int:priority-queue/>! </int:channel>! <int:channel>! <int:dispatcher/>! </int:channel>! <int:channel>! <int:rendezvous-queue/>! </int:channel>! MessageHandler!
  • 52. Direct channels! •  Canal default do Spring Integration! •  Podem ser configurados em XML ou via anotações! <beans  xmlns="http://www.springframework.org/schema/beans"                  xmlns:int="…"                  …                  outros  xmlns  …>            <bean  id="componente"  class="com.pacote.Classe"  />            …          <int:channel  id="tweets"  />          <int:channel  id="tech-­‐tweets"  />          <int:channel  id="tagged-­‐tweets"  />          <int:channel  id="decorated-­‐tweets"  />          <int:channel  id="java-­‐tweets"  />          <int:channel  id="other-­‐tweets"  />   …   </beans>   Arquivo de configuração de contexto (beans)!
  • 53. Twitter template! •  Da API Spring Social •  Necessário para ! poder fazer ! queries na API ! do Twitter! <context:property-­‐placeholder  location="classpath:oauth.properties"  />     <bean  id="twitterTemplate"      class="org.springframework.social.twitter.api.impl.TwitterTemplate">          <constructor-­‐arg  value="${twitter.oauth.consumerKey}"  />          <constructor-­‐arg  value="${twitter.oauth.consumerSecret}"  />          <constructor-­‐arg  value="${twitter.oauth.accessToken}"  />          <constructor-­‐arg  value="${twitter.oauth.accessTokenSecret}"  />   </bean>   twitter.oauth.consumerKey=kSJz4Iy6kcPcLw9wdUaP   twitter.oauth.consumerSecret=kSJz4Iy6kcPcLw9wdUa twitter.oauth.accessToken=kSJz4Iy6kcPcLw9wdUaPcc   twitter.oauth.accessTokenSecret=dSJz4Iy6kc9wdUaP   oauth.properties! Spring application context (beans)! Crie app e obtenha as chaves!
  • 54. Twitter channel adapters! •  Spring Integration possui vários adaptadores de entrada e saída (direct message, search, etc.)! •  Usamos o search-inbound- para fazer queries! <int-­‐twitter:search-­‐inbound-­‐channel-­‐adapter              twitter-­‐template="twitterTemplate"                query="#thedevconf  OR  #tdc2015"                id="raw-­‐tweets">              <int:poller  fixed-­‐rate="60000"                                                max-­‐messages-­‐per-­‐poll="10"  />   </int-­‐twitter:search-­‐inbound-­‐channel-­‐adapter>   Automaticamente cria um direct channel
  • 55. Message Translator 1! •  Para traduzir o payload (objeto Tweet do Spring Social) para uma nova Message (do Spring Integration)! import  org.springframework.social.twitter.api.Tweet;     public  class  TweetTransformer  implements  Transformer  {      @Override    public  Message<?>  transform(Message<?>  msg)  {      Tweet  tweet      =  (Tweet)  msg.getPayload();      String  sender  =  tweet.getFromUser();      String  text      =  tweet.getText();            Message<String>  message  =  MessageBuilder.withPayload(text)          .setHeader("sender",  sender)          .build();        return  message;    }   }   <int:transformer  input-­‐channel="raw-­‐tweets"                                    output-­‐channel="tweets">        <bean  class="br...tdc.TweetTransformer"  />   </int:transformer>  Spring application context (beans)!
  • 56. Message Filter Filtra as mensagens selecionando apenas as que têm links (http / https) Apenas mensagens com links estão neste canal sender: usuario outros headers: … Payload: texto da mensagem Invalid-Message Channel (mensagens que nâo tem links)
  • 57. Message Filters! •  Utiliza um seletor (bean ou expressão SpEL) para escolher mensagens a serem filtradas! •  Opcionalmente pode enviar as mensagens descartadas para um Invalid-Message Channel <bean  id="techTweetSelector"              class="br.com.argonavis.si.examples.tdc.LinkTweetSelector"  />     <int:filter  input-­‐channel="tweets"                            output-­‐channel="tech-­‐tweets"                          discard-­‐channel="discarded-­‐tweets"                                    ref="techTweetSelector"  />   public  class  LinkTweetSelector  implements  MessageSelector  {    public  boolean  accept(Message<?>  message)  {              for  (String  word  :  message.getPayload().split("  "))  {        if  (word.startsWith("http://"))  {  return  true;  }      }            return  false;   }}  
  • 58. Content Enricher Apenas mensagens com links estão neste canal Adiciona um cabeçalho para rotular as mensagens por assunto (“java” ou “other”) sender: usuario subject: assunto outros headers: … Payload: texto da mensagem
  • 59. Content Enrichers! •  Header ou Payload! <bean  id="tweetTagger"                class="br.com.argonavis.si.examples.tdc.TweetSubjectTagger"  />     <int:header-­‐enricher  input-­‐channel="tech-­‐tweets"                                            output-­‐channel="tagged-­‐tweets">            <int:header  name="subject"  method="setSubjectHeader"                                      ref="tweetTagger"  />   </int:header-­‐enricher>   public  class  TweetSubjectTagger  {          public  String  setSubjectHeader(String  payload)  {            if(payload.toLowerCase().indexOf("java")  >=  0)  {              return  "java";            }  else  {              return  "other";  //  web            }          }   }   Elementos <header> também
 podem passar valores fixos! Método do bean ! fornece o valor! do header!
  • 60. Message Translator sender: usuario subject: assunto outros headers: … Payload: texto da mensagem Transforma o texto em fragmento HTML (links em <a href>, hashtags em <span>, etc. Palestra de @helderdarocha sobre EIP patterns e SpringIntegration #TheDevConf https://pic.twitter.com/ eIcFIYAo8T <div class="tweet"><span class="sender">usuario</span>Palestra de <span class="user">@helderdarocha</span> sobre EIP patterns e SpringIntegration <span class="hashtag”>#TheDevConf</span> <a href="https://pic.twitter.com/eIcFIYAo8T”>https://pic.twitter.com/ eIcFIYAo8T</a></div> sender: usuario subject: assunto outros headers: … Payload: <div>html da mensagem</div>
  • 61. Message Translator 2! <bean  id="htmlDecoratorTransformer"                                class="br.com.argonavis.si.examples.tdc.HtmlDecoratorTransformer"  />     <int:transformer  input-­‐channel="tagged-­‐tweets"                                    output-­‐channel="decorated-­‐tweets"                                    ref="htmlDecoratorTransformer"  />   public  class  HtmlDecoratorTransformer  implements  Transformer  {          public  Message<?>  transform(Message<?>  msg)  {              String  newPayload  =  /*  several  transformations  */              String  html  =  "<div  class='tweet'>"  +  newPayload  +  "</div>";              return  MessageBuilder.withPayload(html)                                                        .copyHeaders(msg.getHeaders())                                                        .build();          }   }  
  • 62. Message Router sender: usuario subject: assunto outros headers: … Payload: <div>html </div> sender: usuario subject: java outros headers: … Payload: <div>html </div> sender: usuario subject: other outros headers: … Payload: <div>html </div> Arquivo web/tweets/ JavaTweets.html Arquivo web/tweets/ OtherTweets.html + Outbound! Channel
 Adapter
  • 63. Message Router! •  Header Value Router mapeia valor de um cabeçalho selecionado a diferentes canais! •  Outbound Channel Adapters gravam no arquivo! <int:header-­‐value-­‐router  input-­‐channel="decorated-­‐tweets"                                                    header-­‐name="subject">          <int:mapping  value="java"    channel="java-­‐tweets"  />          <int:mapping  value="other"  channel="other-­‐tweets"  />   </int:header-­‐value-­‐router>   <int-­‐file:outbound-­‐channel-­‐adapter                channel="other-­‐tweets"  charset="UTF-­‐8"  mode="APPEND"                  directory="web-­‐document-­‐root/tweets"                filename-­‐generator-­‐expression="'OtherTweets.html'"  />   <int-­‐file:outbound-­‐channel-­‐adapter                channel="java-­‐tweets"  charset="UTF-­‐8"  mode="APPEND"                        directory="web-­‐document-­‐root/tweets"                filename-­‐generator-­‐expression="'JavaTweets.html'"  />  
  • 65. Outras formas de configurar! •  Spring Integration também pode ser parcialmente ou totalmente configurado via anotações em classes e métodos! •  @Aggregator, @Filter, @Router, @ServiceActivator, @Transformer, @InboundChannelAdapter, etc.! public  class  Servico  {        @ServiceActivator(inputChannel="entrada",  outputChannel="saida”)        public  void  metodo(String  payload,  @Headers  Map<String,  Object>  head)  {                  …        }   }   •  As rotas, desde Spring Integration 4.0, podem ser expressas em Java DSL, que as torna mais legíveis! @Bean  public  IntegrationFlow  splitAggregateFlow()  {          return  IntegrationFlows.from("tweets”)                          .split(null).channel(MessageChannels.executor(this.taskExecutor()))                          .resequence().aggregate().get();   }   •  Camel normalmente declara rotas usando DSLs (não apenas Java)!
  • 66. Camel ou Spring Integration?! •  Resposta baseada em opinião •  Ambos implementam bem vários padrões EIP e possuem gateways e adapters para muitos serviços! •  Se você já usa a plataforma Spring, pode usar Camel (com Spring) ou Spring Integration (se preferir)! •  Se usa Spring XD, SI é melhor pois XD é construído sobre SI! •  Se não usa Spring, Camel é uma alternativa melhor (mais fácil de aprender, flexível e completa – não deve nada ao SI)! •  Se tem um projeto SI e prefere usar Camel, existe uma Ponte Camel – Spring-Integration (https://camel.apache.org/springintegration.html)!
  • 67. Conclusões! •  Esta palestra apresentou uma introdução a padrões de integração de sistemas e Spring Integration! •  Uma visão geral dos padrões de destacando os principais! •  Uma possível solução teórica usando padrões para um problema de integração! •  Uma implementação da solução em Java usando Spring Integration! •  Breve discussão sobre outros recursos e alternativas a Spring Integration!
  • 68. Referências! •  Gregor Hohpe, Bobby Woolf, et al Enterprise Integration Patterns http://www.eaipatterns.com/ •  Spring Integration http://projects.spring.io/spring-integration/ •  Kai Waehner. Integration Framework Comparison – Spring Integration, Mule ESB or Apache Camel! http://www.javacodegeeks.com/2012/03/integration-framework-comparison- spring.html •  Jim White. Spring Integration Tutorial. Intertech, 2014. ! http://www.intertech.com/Blog/spring-integration-part-1-understanding-channels/ Ótimo tutorial passo-a-passo sobre Spring Integration!