SlideShare uma empresa Scribd logo
1 de 8
Baixar para ler offline
Fluxo dinâmicos usando Spring Aplication
A capacidade de controlar a forma como mula cria e gerencia contexto de aplicação
Primavera é um recurso muito útil. Em um compromisso com o cliente recente, eu tinha que
realizar uma operação de integração idêntico, mas a partir de um número variável de fontes
(diferentes para cada ambiente).
Em mula, isto pode ser realizado por:
Adicionando fluxos específicos do sistema duplicado em tempo de compilação, ou
Criando um fluxo modelo, parametrização de configuração e criar uma instância contexto de
aplicação para cada configuração.
Eu prefiro a opção 2, uma vez que é seco e permite controlar facilmente o número de fluxos
de configuração não código.
Como um caso de uso, vamos supor que temos parceiros de negócios que colocam arquivos
em baldes S3, onde buscá-las e movê-los para um local S3 separado. Vamos agora dizer que
nós temos um número variável de parceiros e, portanto, um número variável de origem
baldes S3.
On-boarding novos parceiros significaria que origem e de destino baldes seria diferente e,
provavelmente, frequência de consulta tão bem, mas resto deve permanecer o mesmo. Isto
pode ser alcançado através de:
a adição de um parceiro de configuração específica, e, em seguida
programaticamente criando um contexto de aplicação de um fluxo de template
Construir o nosso aplicativo
Um fluxo modelo é necessário para que possamos parametrizar-lo e mudar endpoints.
Vamos usar seguinte pasta de destino de fluxo e fonte de mudança / baldes de destino e
frequência de consulta.
<flow>
<poll doc:name="Poll">
<fixed-frequency-scheduler frequency="20" timeUnit="SECONDS"/>
<logger message="Flow Start: " level="INFO" doc:name="Log Start"/>
</poll>
<s3:list-objects config-ref="Amazon_S3_GlobalConnector" bucketName="test-partner-1" d
oc:name="List objects"/>
<foreach collection="#[payload]" doc:name="For Each">
<enricher doc:name="Message Enricher" target="#[flowVars['copyObjectResult']]">
<s3:copy-object config-ref="Amazon_S3_GlobalConnector" destinationBucketName="tes
t-system-1" destinationKey="#[payload.getKey()]" sourceBucketName="#[payload.getBuck
etName()]" sourceKey="#[payload.getKey()]" doc:name="Copy object"/>
</enricher>
<s3:delete-object config-ref="Amazon_S3_GlobalConnector" bucketName="test-partner-1
" key="#[payload.getKey()]" doc:name="Delete object"/>
</foreach>
<logger message="Flow End" level="INFO" doc:name="Log Start"/>
</flow>
Bater em mula fases do ciclo de vida de aplicação nos daria a oppurtunity para ler um
arquivo de propriedades e começar um contexto de aplicação com os detalhes específicos de
parceiros. Uma classe Java que implementa org.mule.api.lifecycle.Initialisable e
org.mule.api.lifecycle.Disposable nos deixaria fazer isso.
Durante a fase de Inicializar, mudamos parceiro específico detalhes em nosso fluxo de
modelo e iniciar um contexto de aplicação.
Em fase de descarte, paramos e dispor nosso contexto (s) pedido
public void initialise() throws InitialisationException {
// read template flow
// replace endpoints with properties from configuration file
// create and start an application context
}
public void dispose() {
// stop and dispose application context(s)
}
E, finalmente, uma falha principal, que nos dá acesso às propriedades do arquivo, e chutar
iniciar nossa aplicação.
<context:property-placeholder location="mule-app.properties" />
<flow>
<component doc:name="RouteFactory">
<singleton-object class="demo.RouteFactory">
<property key="partnerCount" value="${partner-count}"/>
</singleton-object>
</component>
</flow>
Dependendo do número de parâmetros, arquivo de propriedades pode acabar olhar como
seguir
partner-count=2
partner-1.flow-name = partner-one-flow
partner-1.polling-frequency = 10
partner-1.source-bucket = test-partner-1
partner-1.destination-folder = partner1/
partner-1.destination-bucket = test-system-1
partner-2.flow-name = partner-two-flow
partner-2.polling-frequency = 20
partner-2.source-bucket = test-partner-2
partner-2.destination-folder =
partner-2.destination-bucket = test-system-2
RouteFactory.java
package demo;
import java.io.ByteArrayInputStream;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.mule.api.MuleContext;
import org.mule.api.MuleException;
import org.mule.api.config.ConfigurationBuilder;
import org.mule.api.lifecycle.Disposable;
import org.mule.api.lifecycle.Initialisable;
import org.mule.api.lifecycle.InitialisationException;
import org.mule.config.ConfigResource;
import org.mule.config.spring.SpringXmlConfigurationBuilder;
import org.mule.context.DefaultMuleContextFactory;
public class RouteFactory implements Initialisable, Disposable{
private HashMap<String,MuleContext> initialisedContexts;
private String s3Namespace = "http://www.mulesoft.org/schema/mule/s3";
private int partnerCount ;
public RouteFactory() {
initialisedContexts = new HashMap<String,MuleContext>();
}
@Override
public void initialise() throws InitialisationException {
System.out.println(this.getClass().getName() + ".initialise(). Total partner count :
int i = 0;
while(i < partnerCount){
i++;
try {
ArrayList<String> config = new ArrayList<String>();
String flowName = System.getProperty("partner-"+i+".flow-name");
String sourceBucket = System.getProperty("partner-"+i+".source-buc
String destinationBucket = System.getProperty("partner-"+i+".destina
String destinationFolder = System.getProperty("partner-"+i+".destina
DocumentBuilderFactory docFactory = DocumentBuilderFactory.new
docFactory.setNamespaceAware(true);
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document flowTemplate = docBuilder.parse(this.getClass().getClassL
S3-object-flow.xml"));
NodeList flow = flowTemplate.getElementsByTagName("flow");
NodeList scheduler = flowTemplate.getElementsByTagName("fixed-
NodeList listObject = flowTemplate.getElementsByTagNameNS(s3N
NodeList copyObject = flowTemplate.getElementsByTagNameNS(s3
NodeList deleteObject = flowTemplate.getElementsByTagNameNS(s
NodeList logger = flowTemplate.getElementsByTagName("logger");
// change flow name
flow.item(0).getAttributes().getNamedItem("name").setNodeValue( f
// change logger message
logger.item(0).getAttributes().getNamedItem("message").setNodeVal
// change frequency
scheduler.item(0).getAttributes().getNamedItem("frequency").setNod
// change source bucket
listObject.item(0).getAttributes().getNamedItem("bucketName").setN
// change destinationBucket and destinationKey(append folder name t
copyObject.item(0).getAttributes().getNamedItem("destinationBucke
copyObject.item(0).getAttributes().getNamedItem("destinationKey")
"payload.getKey()]");
// delete an object from a specific bucket
deleteObject.item(0).getAttributes().getNamedItem("bucketName").s
config.add(getStringFromDoc(flowTemplate));
addFlow(config, flowName);
}catch(Exception e) {
e.printStackTrace(System.out);
}
}// end of while
}
@Override
public void dispose() {
System.out.println(this.getClass().getName() + ".dispose(). Total partner count : "
Iterator<String> iterator = initialisedContexts.keySet().iterator();
while ( iterator.hasNext() ) {
MuleContext muleContext = initialisedContexts.get(iterator.next());
System.out.println(this.getClass().getName() + "Stopping context with flow
try {
muleContext.stop();
muleContext.dispose();
} catch (MuleException e) {
System.out.println(this.getClass().getName() + "Cannot stop context
e.printStackTrace(System.out);
}
}
}
private String getStringFromDoc(Document doc) throws TransformerException {
DOMSource domSource = new DOMSource(doc);
StringWriter writer = new StringWriter();
StreamResult result = new StreamResult(writer);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.transform(domSource, result);
writer.flush();
return writer.toString();
}
private boolean addFlow(ArrayList<String> configs, String flowName) {
boolean flag = false;
try {
// add to mule context
MuleContext muleContext = new DefaultMuleContextFactory().createMule
ConfigResource configResource[] = new ConfigResource[1];
int i = 0 ;
for (String config : configs) {
configResource[i] = new ConfigResource(flowName, new ByteArray
i++;
}
ConfigurationBuilder builder = new SpringXmlConfigurationBuilder(config
builder.configure(muleContext);
muleContext.start();
initialisedContexts.put(flowName, muleContext);
flag = true;
} catch (MuleException me) {
me.printStackTrace(System.out);
}
return flag;
}
public void setPartnerCount(int partnerCount) {
this.partnerCount = partnerCount;
}
}
Conclusão
O exemplo que acabamos de considerar é bastante simples. Para a ousadia entre nós,
poderíamos até mesmo experimentar com a adição de uma API HTTP que cria e destrói os
fluxos para nós sem a necessidade de reiniciar a nossa aplicação.

Mais conteúdo relacionado

Destaque

Principais perguntas sobre mule esb parte 2
Principais perguntas sobre mule esb parte 2 Principais perguntas sobre mule esb parte 2
Principais perguntas sobre mule esb parte 2 Jeison Barros
 
Mule esb teste parte 2
Mule esb teste   parte 2Mule esb teste   parte 2
Mule esb teste parte 2Jeison Barros
 
Mule esb teste parte 1
Mule esb teste   parte 1Mule esb teste   parte 1
Mule esb teste parte 1Jeison Barros
 
Substituindo o request message no mule
Substituindo o request message no muleSubstituindo o request message no mule
Substituindo o request message no muleJeison Barros
 
Usando seu codigo java no mule part 1
Usando seu codigo java no mule part 1Usando seu codigo java no mule part 1
Usando seu codigo java no mule part 1Jeison Barros
 
Usando seu codigo java no mule part 2
Usando seu codigo java no mule part 2Usando seu codigo java no mule part 2
Usando seu codigo java no mule part 2Jeison Barros
 
Mulesoft - Salesforce Analytics Cloud Connector - Part 1
Mulesoft - Salesforce Analytics Cloud Connector - Part 1Mulesoft - Salesforce Analytics Cloud Connector - Part 1
Mulesoft - Salesforce Analytics Cloud Connector - Part 1Jeison Barros
 
Mule esb com framework cucumber part 1
Mule esb com framework cucumber part 1Mule esb com framework cucumber part 1
Mule esb com framework cucumber part 1Jeison Barros
 
Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2Jeison Barros
 
Integração salesforce com mulesoft usando o salesforce conector
Integração salesforce com mulesoft usando o salesforce conectorIntegração salesforce com mulesoft usando o salesforce conector
Integração salesforce com mulesoft usando o salesforce conectorJeison Barros
 
Mule esb com framework cucumber part 2
Mule esb com framework cucumber part 2Mule esb com framework cucumber part 2
Mule esb com framework cucumber part 2Jeison Barros
 
Introdução ao mule esb para iniciantes
Introdução ao mule esb para iniciantesIntrodução ao mule esb para iniciantes
Introdução ao mule esb para iniciantesJeison Barros
 
Restful Introdução com exemplo - Part 2
Restful Introdução com exemplo  - Part 2Restful Introdução com exemplo  - Part 2
Restful Introdução com exemplo - Part 2Jeison Barros
 
Principais duvidas sobre mule
Principais duvidas sobre mulePrincipais duvidas sobre mule
Principais duvidas sobre muleJeison Barros
 
Compilação de tutoriais blog MulePE
Compilação de tutoriais blog MulePECompilação de tutoriais blog MulePE
Compilação de tutoriais blog MulePEJeison Barros
 
Relatório analytics de mula tempo de execução usando splunk
Relatório analytics de mula tempo de execução usando splunkRelatório analytics de mula tempo de execução usando splunk
Relatório analytics de mula tempo de execução usando splunkJeison Barros
 
Começando com mulesoft e maven
Começando com mulesoft e mavenComeçando com mulesoft e maven
Começando com mulesoft e mavenJeison Barros
 
Qual integration framework você deve usar parte 1
Qual integration framework você deve usar parte 1Qual integration framework você deve usar parte 1
Qual integration framework você deve usar parte 1Jeison Barros
 
Estudo de caso: Mule como um transporte JMS Comum
Estudo de caso: Mule como um transporte JMS ComumEstudo de caso: Mule como um transporte JMS Comum
Estudo de caso: Mule como um transporte JMS ComumJeison Barros
 

Destaque (20)

Principais perguntas sobre mule esb parte 2
Principais perguntas sobre mule esb parte 2 Principais perguntas sobre mule esb parte 2
Principais perguntas sobre mule esb parte 2
 
Mule esb teste parte 2
Mule esb teste   parte 2Mule esb teste   parte 2
Mule esb teste parte 2
 
Mule esb teste parte 1
Mule esb teste   parte 1Mule esb teste   parte 1
Mule esb teste parte 1
 
Substituindo o request message no mule
Substituindo o request message no muleSubstituindo o request message no mule
Substituindo o request message no mule
 
Usando seu codigo java no mule part 1
Usando seu codigo java no mule part 1Usando seu codigo java no mule part 1
Usando seu codigo java no mule part 1
 
Usando seu codigo java no mule part 2
Usando seu codigo java no mule part 2Usando seu codigo java no mule part 2
Usando seu codigo java no mule part 2
 
Mulesoft - Salesforce Analytics Cloud Connector - Part 1
Mulesoft - Salesforce Analytics Cloud Connector - Part 1Mulesoft - Salesforce Analytics Cloud Connector - Part 1
Mulesoft - Salesforce Analytics Cloud Connector - Part 1
 
Mule esb com framework cucumber part 1
Mule esb com framework cucumber part 1Mule esb com framework cucumber part 1
Mule esb com framework cucumber part 1
 
Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2
 
Integração salesforce com mulesoft usando o salesforce conector
Integração salesforce com mulesoft usando o salesforce conectorIntegração salesforce com mulesoft usando o salesforce conector
Integração salesforce com mulesoft usando o salesforce conector
 
Mule esb com framework cucumber part 2
Mule esb com framework cucumber part 2Mule esb com framework cucumber part 2
Mule esb com framework cucumber part 2
 
Introdução ao mule esb para iniciantes
Introdução ao mule esb para iniciantesIntrodução ao mule esb para iniciantes
Introdução ao mule esb para iniciantes
 
Restful Introdução com exemplo - Part 2
Restful Introdução com exemplo  - Part 2Restful Introdução com exemplo  - Part 2
Restful Introdução com exemplo - Part 2
 
Principais duvidas sobre mule
Principais duvidas sobre mulePrincipais duvidas sobre mule
Principais duvidas sobre mule
 
Compilação de tutoriais blog MulePE
Compilação de tutoriais blog MulePECompilação de tutoriais blog MulePE
Compilação de tutoriais blog MulePE
 
Relatório analytics de mula tempo de execução usando splunk
Relatório analytics de mula tempo de execução usando splunkRelatório analytics de mula tempo de execução usando splunk
Relatório analytics de mula tempo de execução usando splunk
 
Rest introdução
Rest introduçãoRest introdução
Rest introdução
 
Começando com mulesoft e maven
Começando com mulesoft e mavenComeçando com mulesoft e maven
Começando com mulesoft e maven
 
Qual integration framework você deve usar parte 1
Qual integration framework você deve usar parte 1Qual integration framework você deve usar parte 1
Qual integration framework você deve usar parte 1
 
Estudo de caso: Mule como um transporte JMS Comum
Estudo de caso: Mule como um transporte JMS ComumEstudo de caso: Mule como um transporte JMS Comum
Estudo de caso: Mule como um transporte JMS Comum
 

Semelhante a Spring Aplication Dynamic Flows

Integrando o dev com o ops - Marcelo Castellani
Integrando o dev com o ops - Marcelo CastellaniIntegrando o dev com o ops - Marcelo Castellani
Integrando o dev com o ops - Marcelo CastellaniiMasters
 
Além do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completaAlém do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completaCharles Kilesse
 
Servidor de Aplicação Web: CherryPy - Python
Servidor de Aplicação  Web: CherryPy - PythonServidor de Aplicação  Web: CherryPy - Python
Servidor de Aplicação Web: CherryPy - Pythonantonio sérgio nogueira
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com AjaxAdler Medrado
 
Workshop Mundo Senai - Hello, Angular.js
Workshop Mundo Senai - Hello, Angular.jsWorkshop Mundo Senai - Hello, Angular.js
Workshop Mundo Senai - Hello, Angular.jsFábio Elísio
 
Windows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureWindows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureVitor Ciaramella
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Carlos Duarte do Nascimento
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineCampus Party Brasil
 
Curso de Ruby on Rails - Aula 02
Curso de Ruby on Rails - Aula 02Curso de Ruby on Rails - Aula 02
Curso de Ruby on Rails - Aula 02Maurício Linhares
 
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPyDesenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPyantonio sérgio nogueira
 
Desenvolvendo aplicações com Angular e Laravel no Back-end
Desenvolvendo aplicações com Angular e Laravel no Back-endDesenvolvendo aplicações com Angular e Laravel no Back-end
Desenvolvendo aplicações com Angular e Laravel no Back-endGiovanny Valente
 
Palestra DataFlow - II São Paulo Perl Workshop
Palestra DataFlow - II São Paulo Perl WorkshopPalestra DataFlow - II São Paulo Perl Workshop
Palestra DataFlow - II São Paulo Perl WorkshopAlexei Znamensky
 
PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETslides_teltools
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSMatheus Donizete
 

Semelhante a Spring Aplication Dynamic Flows (20)

Integrando o dev com o ops - Marcelo Castellani
Integrando o dev com o ops - Marcelo CastellaniIntegrando o dev com o ops - Marcelo Castellani
Integrando o dev com o ops - Marcelo Castellani
 
Workshop Django
Workshop DjangoWorkshop Django
Workshop Django
 
Além do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completaAlém do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completa
 
cypress.pdf
cypress.pdfcypress.pdf
cypress.pdf
 
Servidor de Aplicação Web: CherryPy - Python
Servidor de Aplicação  Web: CherryPy - PythonServidor de Aplicação  Web: CherryPy - Python
Servidor de Aplicação Web: CherryPy - Python
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com Ajax
 
Python 07
Python 07Python 07
Python 07
 
Workshop Mundo Senai - Hello, Angular.js
Workshop Mundo Senai - Hello, Angular.jsWorkshop Mundo Senai - Hello, Angular.js
Workshop Mundo Senai - Hello, Angular.js
 
Jquery a technical overview
Jquery a technical overviewJquery a technical overview
Jquery a technical overview
 
Windows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureWindows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows Azure
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
 
Curso de Ruby on Rails - Aula 02
Curso de Ruby on Rails - Aula 02Curso de Ruby on Rails - Aula 02
Curso de Ruby on Rails - Aula 02
 
Django Módulo Básico Parte II
Django Módulo Básico Parte IIDjango Módulo Básico Parte II
Django Módulo Básico Parte II
 
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPyDesenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
 
Desenvolvendo aplicações com Angular e Laravel no Back-end
Desenvolvendo aplicações com Angular e Laravel no Back-endDesenvolvendo aplicações com Angular e Laravel no Back-end
Desenvolvendo aplicações com Angular e Laravel no Back-end
 
Palestra DataFlow - II São Paulo Perl Workshop
Palestra DataFlow - II São Paulo Perl WorkshopPalestra DataFlow - II São Paulo Perl Workshop
Palestra DataFlow - II São Paulo Perl Workshop
 
Java e Cloud Computing
Java e Cloud ComputingJava e Cloud Computing
Java e Cloud Computing
 
PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NET
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JS
 

Mais de Jeison Barros

Introdução a RAML - parte 1
Introdução a RAML -  parte 1Introdução a RAML -  parte 1
Introdução a RAML - parte 1Jeison Barros
 
O básico do uso de rest vs soap
O básico do uso de rest vs soapO básico do uso de rest vs soap
O básico do uso de rest vs soapJeison Barros
 
Restful considerada prejudicial - parte 1
Restful considerada prejudicial -  parte 1Restful considerada prejudicial -  parte 1
Restful considerada prejudicial - parte 1Jeison Barros
 
Restful considerada prejudicial parte 2
Restful considerada prejudicial   parte 2Restful considerada prejudicial   parte 2
Restful considerada prejudicial parte 2Jeison Barros
 
Estratégia api e design
Estratégia api e designEstratégia api e design
Estratégia api e designJeison Barros
 
Transformando eficientemente resultados de uma consulta jdbc para json
Transformando eficientemente resultados de uma consulta jdbc para jsonTransformando eficientemente resultados de uma consulta jdbc para json
Transformando eficientemente resultados de uma consulta jdbc para jsonJeison Barros
 
Como criar um http proxy dinamico com mule parte 3
Como criar um http proxy dinamico com mule   parte 3Como criar um http proxy dinamico com mule   parte 3
Como criar um http proxy dinamico com mule parte 3Jeison Barros
 
Como criar um http proxy dinamico com mule parte 1
Como criar um http proxy dinamico com mule   parte 1Como criar um http proxy dinamico com mule   parte 1
Como criar um http proxy dinamico com mule parte 1Jeison Barros
 
Conectando seu banco de dados usando jdbc
Conectando seu banco de dados usando jdbcConectando seu banco de dados usando jdbc
Conectando seu banco de dados usando jdbcJeison Barros
 
Habilidades necessárias para integrar aplicativos e dados
Habilidades necessárias para integrar aplicativos e dadosHabilidades necessárias para integrar aplicativos e dados
Habilidades necessárias para integrar aplicativos e dadosJeison Barros
 
Qual integration framework você deve usar parte 2
Qual integration framework você deve usar parte 2Qual integration framework você deve usar parte 2
Qual integration framework você deve usar parte 2Jeison Barros
 
Consumindo soap wsdl
Consumindo soap wsdlConsumindo soap wsdl
Consumindo soap wsdlJeison Barros
 
Trabalhando com anexos soap usando módulo cxf do mule
Trabalhando com anexos soap usando módulo cxf do muleTrabalhando com anexos soap usando módulo cxf do mule
Trabalhando com anexos soap usando módulo cxf do muleJeison Barros
 
Explorando mule esb sftp adapter
Explorando mule esb sftp adapterExplorando mule esb sftp adapter
Explorando mule esb sftp adapterJeison Barros
 

Mais de Jeison Barros (16)

Pdfteste
PdftestePdfteste
Pdfteste
 
Introdução a RAML - parte 1
Introdução a RAML -  parte 1Introdução a RAML -  parte 1
Introdução a RAML - parte 1
 
O básico do uso de rest vs soap
O básico do uso de rest vs soapO básico do uso de rest vs soap
O básico do uso de rest vs soap
 
Restful considerada prejudicial - parte 1
Restful considerada prejudicial -  parte 1Restful considerada prejudicial -  parte 1
Restful considerada prejudicial - parte 1
 
Restful considerada prejudicial parte 2
Restful considerada prejudicial   parte 2Restful considerada prejudicial   parte 2
Restful considerada prejudicial parte 2
 
Estratégia api e design
Estratégia api e designEstratégia api e design
Estratégia api e design
 
Transformando eficientemente resultados de uma consulta jdbc para json
Transformando eficientemente resultados de uma consulta jdbc para jsonTransformando eficientemente resultados de uma consulta jdbc para json
Transformando eficientemente resultados de uma consulta jdbc para json
 
Como criar um http proxy dinamico com mule parte 3
Como criar um http proxy dinamico com mule   parte 3Como criar um http proxy dinamico com mule   parte 3
Como criar um http proxy dinamico com mule parte 3
 
Como criar um http proxy dinamico com mule parte 1
Como criar um http proxy dinamico com mule   parte 1Como criar um http proxy dinamico com mule   parte 1
Como criar um http proxy dinamico com mule parte 1
 
Rest api vs SOAP
Rest api vs SOAPRest api vs SOAP
Rest api vs SOAP
 
Conectando seu banco de dados usando jdbc
Conectando seu banco de dados usando jdbcConectando seu banco de dados usando jdbc
Conectando seu banco de dados usando jdbc
 
Habilidades necessárias para integrar aplicativos e dados
Habilidades necessárias para integrar aplicativos e dadosHabilidades necessárias para integrar aplicativos e dados
Habilidades necessárias para integrar aplicativos e dados
 
Qual integration framework você deve usar parte 2
Qual integration framework você deve usar parte 2Qual integration framework você deve usar parte 2
Qual integration framework você deve usar parte 2
 
Consumindo soap wsdl
Consumindo soap wsdlConsumindo soap wsdl
Consumindo soap wsdl
 
Trabalhando com anexos soap usando módulo cxf do mule
Trabalhando com anexos soap usando módulo cxf do muleTrabalhando com anexos soap usando módulo cxf do mule
Trabalhando com anexos soap usando módulo cxf do mule
 
Explorando mule esb sftp adapter
Explorando mule esb sftp adapterExplorando mule esb sftp adapter
Explorando mule esb sftp adapter
 

Spring Aplication Dynamic Flows

  • 1. Fluxo dinâmicos usando Spring Aplication A capacidade de controlar a forma como mula cria e gerencia contexto de aplicação Primavera é um recurso muito útil. Em um compromisso com o cliente recente, eu tinha que realizar uma operação de integração idêntico, mas a partir de um número variável de fontes (diferentes para cada ambiente). Em mula, isto pode ser realizado por: Adicionando fluxos específicos do sistema duplicado em tempo de compilação, ou Criando um fluxo modelo, parametrização de configuração e criar uma instância contexto de aplicação para cada configuração. Eu prefiro a opção 2, uma vez que é seco e permite controlar facilmente o número de fluxos de configuração não código. Como um caso de uso, vamos supor que temos parceiros de negócios que colocam arquivos em baldes S3, onde buscá-las e movê-los para um local S3 separado. Vamos agora dizer que nós temos um número variável de parceiros e, portanto, um número variável de origem baldes S3. On-boarding novos parceiros significaria que origem e de destino baldes seria diferente e, provavelmente, frequência de consulta tão bem, mas resto deve permanecer o mesmo. Isto pode ser alcançado através de: a adição de um parceiro de configuração específica, e, em seguida programaticamente criando um contexto de aplicação de um fluxo de template Construir o nosso aplicativo Um fluxo modelo é necessário para que possamos parametrizar-lo e mudar endpoints. Vamos usar seguinte pasta de destino de fluxo e fonte de mudança / baldes de destino e frequência de consulta. <flow> <poll doc:name="Poll">
  • 2. <fixed-frequency-scheduler frequency="20" timeUnit="SECONDS"/> <logger message="Flow Start: " level="INFO" doc:name="Log Start"/> </poll> <s3:list-objects config-ref="Amazon_S3_GlobalConnector" bucketName="test-partner-1" d oc:name="List objects"/> <foreach collection="#[payload]" doc:name="For Each"> <enricher doc:name="Message Enricher" target="#[flowVars['copyObjectResult']]"> <s3:copy-object config-ref="Amazon_S3_GlobalConnector" destinationBucketName="tes t-system-1" destinationKey="#[payload.getKey()]" sourceBucketName="#[payload.getBuck etName()]" sourceKey="#[payload.getKey()]" doc:name="Copy object"/> </enricher> <s3:delete-object config-ref="Amazon_S3_GlobalConnector" bucketName="test-partner-1 " key="#[payload.getKey()]" doc:name="Delete object"/> </foreach> <logger message="Flow End" level="INFO" doc:name="Log Start"/> </flow> Bater em mula fases do ciclo de vida de aplicação nos daria a oppurtunity para ler um arquivo de propriedades e começar um contexto de aplicação com os detalhes específicos de parceiros. Uma classe Java que implementa org.mule.api.lifecycle.Initialisable e org.mule.api.lifecycle.Disposable nos deixaria fazer isso. Durante a fase de Inicializar, mudamos parceiro específico detalhes em nosso fluxo de modelo e iniciar um contexto de aplicação. Em fase de descarte, paramos e dispor nosso contexto (s) pedido public void initialise() throws InitialisationException { // read template flow // replace endpoints with properties from configuration file // create and start an application context } public void dispose() { // stop and dispose application context(s)
  • 3. } E, finalmente, uma falha principal, que nos dá acesso às propriedades do arquivo, e chutar iniciar nossa aplicação. <context:property-placeholder location="mule-app.properties" /> <flow> <component doc:name="RouteFactory"> <singleton-object class="demo.RouteFactory"> <property key="partnerCount" value="${partner-count}"/> </singleton-object> </component> </flow> Dependendo do número de parâmetros, arquivo de propriedades pode acabar olhar como seguir partner-count=2 partner-1.flow-name = partner-one-flow partner-1.polling-frequency = 10 partner-1.source-bucket = test-partner-1 partner-1.destination-folder = partner1/ partner-1.destination-bucket = test-system-1 partner-2.flow-name = partner-two-flow partner-2.polling-frequency = 20 partner-2.source-bucket = test-partner-2 partner-2.destination-folder = partner-2.destination-bucket = test-system-2 RouteFactory.java
  • 4. package demo; import java.io.ByteArrayInputStream; import java.io.StringWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.mule.api.MuleContext; import org.mule.api.MuleException; import org.mule.api.config.ConfigurationBuilder; import org.mule.api.lifecycle.Disposable; import org.mule.api.lifecycle.Initialisable; import org.mule.api.lifecycle.InitialisationException; import org.mule.config.ConfigResource; import org.mule.config.spring.SpringXmlConfigurationBuilder; import org.mule.context.DefaultMuleContextFactory; public class RouteFactory implements Initialisable, Disposable{ private HashMap<String,MuleContext> initialisedContexts; private String s3Namespace = "http://www.mulesoft.org/schema/mule/s3"; private int partnerCount ; public RouteFactory() { initialisedContexts = new HashMap<String,MuleContext>(); }
  • 5. @Override public void initialise() throws InitialisationException { System.out.println(this.getClass().getName() + ".initialise(). Total partner count : int i = 0; while(i < partnerCount){ i++; try { ArrayList<String> config = new ArrayList<String>(); String flowName = System.getProperty("partner-"+i+".flow-name"); String sourceBucket = System.getProperty("partner-"+i+".source-buc String destinationBucket = System.getProperty("partner-"+i+".destina String destinationFolder = System.getProperty("partner-"+i+".destina DocumentBuilderFactory docFactory = DocumentBuilderFactory.new docFactory.setNamespaceAware(true); DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); Document flowTemplate = docBuilder.parse(this.getClass().getClassL S3-object-flow.xml")); NodeList flow = flowTemplate.getElementsByTagName("flow"); NodeList scheduler = flowTemplate.getElementsByTagName("fixed- NodeList listObject = flowTemplate.getElementsByTagNameNS(s3N NodeList copyObject = flowTemplate.getElementsByTagNameNS(s3 NodeList deleteObject = flowTemplate.getElementsByTagNameNS(s NodeList logger = flowTemplate.getElementsByTagName("logger"); // change flow name flow.item(0).getAttributes().getNamedItem("name").setNodeValue( f // change logger message logger.item(0).getAttributes().getNamedItem("message").setNodeVal // change frequency scheduler.item(0).getAttributes().getNamedItem("frequency").setNod // change source bucket
  • 6. listObject.item(0).getAttributes().getNamedItem("bucketName").setN // change destinationBucket and destinationKey(append folder name t copyObject.item(0).getAttributes().getNamedItem("destinationBucke copyObject.item(0).getAttributes().getNamedItem("destinationKey") "payload.getKey()]"); // delete an object from a specific bucket deleteObject.item(0).getAttributes().getNamedItem("bucketName").s config.add(getStringFromDoc(flowTemplate)); addFlow(config, flowName); }catch(Exception e) { e.printStackTrace(System.out); } }// end of while } @Override public void dispose() { System.out.println(this.getClass().getName() + ".dispose(). Total partner count : " Iterator<String> iterator = initialisedContexts.keySet().iterator(); while ( iterator.hasNext() ) { MuleContext muleContext = initialisedContexts.get(iterator.next()); System.out.println(this.getClass().getName() + "Stopping context with flow try { muleContext.stop(); muleContext.dispose(); } catch (MuleException e) { System.out.println(this.getClass().getName() + "Cannot stop context e.printStackTrace(System.out); } } }
  • 7. private String getStringFromDoc(Document doc) throws TransformerException { DOMSource domSource = new DOMSource(doc); StringWriter writer = new StringWriter(); StreamResult result = new StreamResult(writer); TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); transformer.transform(domSource, result); writer.flush(); return writer.toString(); } private boolean addFlow(ArrayList<String> configs, String flowName) { boolean flag = false; try { // add to mule context MuleContext muleContext = new DefaultMuleContextFactory().createMule ConfigResource configResource[] = new ConfigResource[1]; int i = 0 ; for (String config : configs) { configResource[i] = new ConfigResource(flowName, new ByteArray i++; } ConfigurationBuilder builder = new SpringXmlConfigurationBuilder(config builder.configure(muleContext); muleContext.start(); initialisedContexts.put(flowName, muleContext); flag = true; } catch (MuleException me) { me.printStackTrace(System.out); } return flag; }
  • 8. public void setPartnerCount(int partnerCount) { this.partnerCount = partnerCount; } } Conclusão O exemplo que acabamos de considerar é bastante simples. Para a ousadia entre nós, poderíamos até mesmo experimentar com a adição de uma API HTTP que cria e destrói os fluxos para nós sem a necessidade de reiniciar a nossa aplicação.