SlideShare uma empresa Scribd logo
1 de 8
Baixar para ler offline
Substituindo o Request Message no Mule
Ao trabalhar com os conectores de SFTP / FTP em Mule, pode ser
necessário para substituir o conector, a fim de implementar a sua lógica
personalizada. Isto pode ser útil quando a ordem de arquivos a serem
processados é importante, por exemplo. Por exemplo, considere que, em
seu caminho de arquivo de alguns ficheiros são ordenados usando um
exemplo chave 'File_01.txt' e 'file_02.txt', e você deseja consumir arquivos
de forma incremental ou seja, 'file_01.txt' deve ser processado antes
‘file_02.txt’.
Implementando a lógica acima quando o endpoint SFTP funciona como um
ponto de extremidade de entrada é bastante simples. Tudo que você precisa
fazer é substituir o receptor da mensagem sobre o conector do SFTP com o
seu código personalizado.
<sftp:connector name="SFTP" validateConnections="true"
doc:name="SFTP-Sorted"
archiveDir="${sftp.jdeArchiveFilePath}"
keepFileOnError="true"
preferredAuthenticationMethods="publickey,password,keyboard-
interactive">
<service-overrides
messageReceiver="com.ricston.NewSftpReceiver"/>
</sftp:connector>
Por outro lado, quando o conector é chamada através de um ponto de
extremidade de quartzo ou através do módulo solicitante o receptor da
mensagem não será chamada, em vez do conector irá usar o solicitador de
mensagem para recuperar o arquivo. Por esta razão, a substituição de
serviço não pode ser utilizado, uma vez que não fornece uma maneira para
substituir o solicitante. Neste post nós fornecemos um exemplo de trabalho
de como isso pode ser feito.
Uma maneira fácil de alcançar nosso objetivo é substituir as classes usadas
pelo conector de SFTP. Para verificar exatamente quais classes estão sendo
usados, vá para 'sftp.properties' encontrada no pote de mula-transport-sftp
que vem com a distribuição mula que você está usando. Uma das
propriedades listadas neste arquivo é o 'requester.factory ", que aponta para
a classe' org.mule.transport.sftp.SftpMessageRequesterFactory '.
Depois de analisar esta classe e as classes faz referência, você deve
observar que o método dos getAvailableFiles 'está sendo usado para
recuperar a lista de todos os arquivos presentes no diretório especificado; e
isso é exatamente o método que deseja usar para retornar a lista dos
arquivos ordenados.
Isto é bastante fácil de fazer; criamos nosso costume
SftpReceiverRequesterUtil que se estende 'SftpReceiverRequesterUtil' e
substituir os getAvailableFiles () para incluir a lógica de classificação e
retornar o primeiro arquivo na lista.
package com.ricston.requester;
import java.util.Arrays;
import org.mule.api.endpoint.ImmutableEndpoint;
import org.mule.transport.sftp.SftpReceiverRequesterUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SortedSftpReceiverRequesterUtil extends
SftpReceiverRequesterUtil {
private static final Logger logger = LoggerFactory
.getLogger(SortedSftpReceiverRequesterUtil.class);
public SortedSftpReceiverRequesterUtil(ImmutableEndpoint
endpoint) {
super(endpoint);
}
@Override
public String[] getAvailableFiles(boolean onlyGetTheFirstOne)
throws Exception {
String[] availableFiles = super.getAvailableFiles(false);
sortFiles(availableFiles);
// Return first file in list only
String[] firstFile = new String[1];
if (availableFiles.length > 1) {
firstFile[0] = availableFiles[0];
return firstFile;
} else {
return availableFiles;
}
}
private void sortFiles(String availableFiles[]) {
int n = availableFiles.length;
int k;
for (int m = n; m >= 0; m--) {
for (int i = 0; i < m - 1; i++) {
k = i + 1;
int firstBatchNumber =
getBatchNumber(availableFiles[i]);
int secondBatchNumber =
getBatchNumber(availableFiles[k]);
if (firstBatchNumber >
secondBatchNumber) {
swapFiles(i, k, availableFiles);
}
}
}
}
private int getBatchNumber(String fileName) {
return Integer.parseInt(fileName.substring(
fileName.lastIndexOf("_") + 1,
fileName.lastIndexOf(".")));
}
private void swapFiles(int i, int j, String[] availableFiles) {
String temp;
temp = availableFiles[i];
availableFiles[i] = availableFiles[j];
availableFiles[j] = temp;
}
}
A fim de tornar o 'SftpMessageRequester' usar o nosso código, nós criamos
nosso SftpMessageRequester personalizado que se refere ao nosso costume
'SftpReceiverRequesterUtil' criado na etapa anterior. Esta classe terá o
mesmo comportamento como o "SftpMessageRequester ', mas em vez de
instanciar' SftpReceiverRequesterUtil ', ele irá instanciar'
SortedSftpReceiverRequesterUtil '.
package com.ricston.requester;
import java.io.InputStream;
import org.mule.api.MuleMessage;
import org.mule.api.endpoint.InboundEndpoint;
import org.mule.api.transport.PropertyScope;
import org.mule.transport.AbstractMessageRequester;
import org.mule.transport.sftp.SftpConnector;
import org.mule.transport.sftp.notification.SftpNotifier;
public class CustomSftpMessageRequester extends
AbstractMessageRequester {
private SortedSftpReceiverRequesterUtil sftpRRUtil = null;
public CustomSftpMessageRequester(InboundEndpoint endpoint)
{
super(endpoint);
sftpRRUtil = new
SortedSftpReceiverRequesterUtil(endpoint);
}
@Override
protected MuleMessage doRequest(long timeout) throws Exception
{
String[] files = sftpRRUtil.getAvailableFiles(true);
if (files.length == 0)
return null;
String path = files[0];
// TODO. ML FIX. Can't we figure out the current service
(for
// logging/audit
// purpose)???
SftpNotifier notifier = new SftpNotifier((SftpConnector)
connector,
createNullMuleMessage(), endpoint,
endpoint.getName());
InputStream inputStream = sftpRRUtil.retrieveFile(path,
notifier);
logger.debug("Routing file: " + path);
MuleMessage message =
createMuleMessage(inputStream);
message.setProperty(SftpConnector.PROPERTY_ORIGINAL_FIL
ENAME, path,
PropertyScope.INBOUND);
// Now we can update the notifier with the message
notifier.setMessage(message);
return message;
}
}
Finalmente, queremos criar uma nova classe de fábrica com o mesmo
comportamento como 'SftpMessageRequesterFactory ", mas em vez de
retornar" SftpMessageRequester', ele irá retornar
'CustomSftpMessageRequester'.
package com.ricston.requester;
import org.mule.api.MuleException;
import org.mule.api.endpoint.InboundEndpoint;
import org.mule.api.transport.MessageRequester;
import org.mule.transport.AbstractMessageRequesterFactory;
public class CustomSftpMessageRequesterFactory extends
AbstractMessageRequesterFactory
{
public MessageRequester create(InboundEndpoint endpoint) throws
MuleException
{
return new CustomSftpMessageRequester(endpoint);
}
}
Agora que estamos a fazer com o código, queremos substituir o conector de
SFTP para que ele faz uso desta classe de fábrica recém-criada. Para fazer
isso, usamos mola para substituir a propriedade 'requester.factory'
encontrado em sftp.properties.
<sftp:connector name="SFTP" validateConnections="true"
doc:name="SFTP-Sorted"
archiveDir="/archiveDir"
keepFileOnError="true"
preferredAuthenticationMethods="publickey,password,keyboard-
interactive">
<spring:property name="serviceOverrides">
<spring:map>
<spring:entry key="requester.factory"
value="com.ricston.requester.CustomSftpMessageRequesterFactor
y" />
</spring:map>
</spring:property>
</sftp:connector>
Isso é tudo o que você precisa fazer para processar arquivos em ordem.
Para testar isso, coloque dois arquivos ou mais em um diretório de sua
escolha, e apontar o endpoint SFTP para este diretório. Note-se que para
este trabalho o nome do arquivo deve terminar com; _number.extension
(verifique getBatchNumber () in SortedSftpReceiverRequesterUtil.java).
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:vm="http://www.mulesoft.org/schema/mule/vm"
xmlns:http="http://www.mulesoft.org/schema/mule/http"
xmlns:mulerequester="http://www.mulesoft.org/schema/mule/mule
requester"
xmlns:file="http://www.mulesoft.org/schema/mule/file"
xmlns:sftp="http://www.mulesoft.org/schema/mule/sftp"
xmlns="http://www.mulesoft.org/schema/mule/core"
xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
xmlns:spring="http://www.springframework.org/schema/beans"
version="EE-3.6.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.mulesoft.org/schema/mule/sftp
http://www.mulesoft.org/schema/mule/sftp/current/mule-sftp.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core
http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/file
http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd
http://www.mulesoft.org/schema/mule/http
http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/mulerequester
http://www.mulesoft.org/schema/mule/mulerequester/current/mule-
mulerequester.xsd
http://www.mulesoft.org/schema/mule/vm
http://www.mulesoft.org/schema/mule/vm/current/mule-vm.xsd">
<sftp:connector name="SFTP" validateConnections="true"
doc:name="SFTP-Sorted"
archiveDir="/archiveDir"
keepFileOnError="true"
preferredAuthenticationMethods="publickey,password,keyboard-
interactive">
<spring:property name="serviceOverrides">
<spring:map>
<spring:entry key="requester.factory"
value="com.ricston.requester.CustomSftpMessageRequesterFactor
y" />
</spring:map>
</spring:property>
</sftp:connector>
<sftp:endpoint name="SFTP-CustomerUpdate-FileEndpoint"
host="localhost" user="user" password="pass" port="22"
path="path"
doc:name="SFTP" />
<http:listener-config name="HTTP_Listener_Configuration"
host="0.0.0.0" port="8081" doc:name="HTTP Listener
Configuration" />
<mulerequester:config name="Mule_Requester"
doc:name="Mule Requester" />
<flow name="blogpostFlow">
<http:listener config-ref="HTTP_Listener_Configuration"
path="/" doc:name="HTTP" />
<mulerequester:request config-ref="Mule_Requester"
resource="SFTP-CustomerUpdate-FileEndpoint"
doc:name="Mule Requester" />
<logger level="INFO" doc:name="Logger"
message="#[message.inboundProperties.originalFilename]" />
</flow>
</mule>
Traduzido de : https://www.ricston.com/blog/overriding-message-
requester-mule/

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1
 
Servlets e JSP
Servlets e JSPServlets e JSP
Servlets e JSP
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)
 
JSPs Introdução Parte 1
JSPs Introdução Parte 1JSPs Introdução Parte 1
JSPs Introdução Parte 1
 
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
 
De Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupDe Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações Mashup
 
UNIFAL - MySQL Logs - 5.0/5.6
UNIFAL - MySQL Logs - 5.0/5.6UNIFAL - MySQL Logs - 5.0/5.6
UNIFAL - MySQL Logs - 5.0/5.6
 
Servlets e jsp
Servlets e jspServlets e jsp
Servlets e jsp
 
Ajax
AjaxAjax
Ajax
 
Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3
 
PHPMyadmin - Introdução
PHPMyadmin - IntroduçãoPHPMyadmin - Introdução
PHPMyadmin - Introdução
 
Servlets e JSP
Servlets e JSPServlets e JSP
Servlets e JSP
 
Apache Struts
Apache StrutsApache Struts
Apache Struts
 
Engenharia da Computação: Resumo servlet + jsp br galo
Engenharia da Computação: Resumo servlet + jsp br galoEngenharia da Computação: Resumo servlet + jsp br galo
Engenharia da Computação: Resumo servlet + jsp br galo
 
Crud
CrudCrud
Crud
 
Aulão de docker
Aulão de dockerAulão de docker
Aulão de docker
 
Utilitários para Programação Concorrente em Java (2005)
Utilitários para Programação Concorrente em Java (2005)Utilitários para Programação Concorrente em Java (2005)
Utilitários para Programação Concorrente em Java (2005)
 
PHP Básico - Parte 4
PHP Básico - Parte 4PHP Básico - Parte 4
PHP Básico - Parte 4
 
Treinamento Oracle GoldenGate 19c
Treinamento Oracle GoldenGate 19cTreinamento Oracle GoldenGate 19c
Treinamento Oracle GoldenGate 19c
 
Servlet jsp tomcat 8
Servlet jsp tomcat 8Servlet jsp tomcat 8
Servlet jsp tomcat 8
 

Destaque

Validating a soap request in mule
Validating a soap request in muleValidating a soap request in mule
Validating a soap request in muleKhan625
 
Validate soap request in mule
Validate soap request in muleValidate soap request in mule
Validate soap request in muleHasan Syed
 
Validating a soap request in mule
Validating a soap request in muleValidating a soap request in mule
Validating a soap request in muleRajkattamuri
 
Museo De Genalguacil
Museo De GenalguacilMuseo De Genalguacil
Museo De Genalguacilbertha reyes
 
Csc1100 lecture01 ch01 pt2-paradigm (1)
Csc1100 lecture01 ch01 pt2-paradigm (1)Csc1100 lecture01 ch01 pt2-paradigm (1)
Csc1100 lecture01 ch01 pt2-paradigm (1)IIUM
 
SPIRIT AWARD Q4 spirit Magazine
SPIRIT AWARD Q4 spirit MagazineSPIRIT AWARD Q4 spirit Magazine
SPIRIT AWARD Q4 spirit MagazineTegan Marroquin
 
International Market entry strategies: Agency Model
International Market entry strategies: Agency ModelInternational Market entry strategies: Agency Model
International Market entry strategies: Agency ModelPrakaash Govindasamy
 
Introduction fundamentals sets and sequences (notes)
Introduction  fundamentals sets and sequences (notes)Introduction  fundamentals sets and sequences (notes)
Introduction fundamentals sets and sequences (notes)IIUM
 
Group project overall
Group project overallGroup project overall
Group project overallIIUM
 
Uso de comandos insert, update y delete en bases de datos de sql server
Uso de comandos insert, update y delete en bases de datos de sql serverUso de comandos insert, update y delete en bases de datos de sql server
Uso de comandos insert, update y delete en bases de datos de sql serverPedrangas Pedrangas
 
Csc1100 lecture12 ch08_pt2
Csc1100 lecture12 ch08_pt2Csc1100 lecture12 ch08_pt2
Csc1100 lecture12 ch08_pt2IIUM
 
Hex bolt drawings
Hex bolt drawingsHex bolt drawings
Hex bolt drawingsgirishdn
 
Educational issues in the context of urbanization, globalization and privatiz...
Educational issues in the context of urbanization, globalization and privatiz...Educational issues in the context of urbanization, globalization and privatiz...
Educational issues in the context of urbanization, globalization and privatiz...Hathib KK
 
7079581 quantitative-techniques-for-management
7079581 quantitative-techniques-for-management7079581 quantitative-techniques-for-management
7079581 quantitative-techniques-for-managementlakshmi narayana murthy
 

Destaque (17)

Validating a soap request in mule
Validating a soap request in muleValidating a soap request in mule
Validating a soap request in mule
 
Validate soap request in mule
Validate soap request in muleValidate soap request in mule
Validate soap request in mule
 
Validating a soap request in mule
Validating a soap request in muleValidating a soap request in mule
Validating a soap request in mule
 
Museo De Genalguacil
Museo De GenalguacilMuseo De Genalguacil
Museo De Genalguacil
 
Csc1100 lecture01 ch01 pt2-paradigm (1)
Csc1100 lecture01 ch01 pt2-paradigm (1)Csc1100 lecture01 ch01 pt2-paradigm (1)
Csc1100 lecture01 ch01 pt2-paradigm (1)
 
SPIRIT AWARD Q4 spirit Magazine
SPIRIT AWARD Q4 spirit MagazineSPIRIT AWARD Q4 spirit Magazine
SPIRIT AWARD Q4 spirit Magazine
 
International Market entry strategies: Agency Model
International Market entry strategies: Agency ModelInternational Market entry strategies: Agency Model
International Market entry strategies: Agency Model
 
Introduction fundamentals sets and sequences (notes)
Introduction  fundamentals sets and sequences (notes)Introduction  fundamentals sets and sequences (notes)
Introduction fundamentals sets and sequences (notes)
 
Group project overall
Group project overallGroup project overall
Group project overall
 
Uso de comandos insert, update y delete en bases de datos de sql server
Uso de comandos insert, update y delete en bases de datos de sql serverUso de comandos insert, update y delete en bases de datos de sql server
Uso de comandos insert, update y delete en bases de datos de sql server
 
Csc1100 lecture12 ch08_pt2
Csc1100 lecture12 ch08_pt2Csc1100 lecture12 ch08_pt2
Csc1100 lecture12 ch08_pt2
 
Hex bolt drawings
Hex bolt drawingsHex bolt drawings
Hex bolt drawings
 
Educational issues in the context of urbanization, globalization and privatiz...
Educational issues in the context of urbanization, globalization and privatiz...Educational issues in the context of urbanization, globalization and privatiz...
Educational issues in the context of urbanization, globalization and privatiz...
 
Aprendizaje in 2
Aprendizaje in 2Aprendizaje in 2
Aprendizaje in 2
 
Aprendizaje invisible 2
Aprendizaje invisible 2Aprendizaje invisible 2
Aprendizaje invisible 2
 
7079581 quantitative-techniques-for-management
7079581 quantitative-techniques-for-management7079581 quantitative-techniques-for-management
7079581 quantitative-techniques-for-management
 
Operaciones Básicas en PHP
Operaciones Básicas en PHPOperaciones Básicas en PHP
Operaciones Básicas en PHP
 

Semelhante a Substituir Request SFTP Mule

Threads 10: CompletableFuture
Threads 10: CompletableFutureThreads 10: CompletableFuture
Threads 10: CompletableFutureHelder da Rocha
 
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1Thyago Maia
 
Threads 08: Executores e Futures
Threads 08: Executores e FuturesThreads 08: Executores e Futures
Threads 08: Executores e FuturesHelder da Rocha
 
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
 
Ajax O Objeto Xml Http Request Parte 4
Ajax   O Objeto Xml Http Request   Parte 4Ajax   O Objeto Xml Http Request   Parte 4
Ajax O Objeto Xml Http Request Parte 4infinitopublicidade
 
VRaptor - Alta produtividade no Desenvolvimento Web em Java
VRaptor - Alta produtividade no Desenvolvimento Web em JavaVRaptor - Alta produtividade no Desenvolvimento Web em Java
VRaptor - Alta produtividade no Desenvolvimento Web em JavaDaniel Faria Gomes
 
WebService Restful em Java
WebService Restful em JavaWebService Restful em Java
WebService Restful em Javaalexmacedo
 
Mule esb teste parte 2
Mule esb teste   parte 2Mule esb teste   parte 2
Mule esb teste parte 2Jeison Barros
 
Desenvolvimento de sistemas web com PHP Frameworks - Aula 2
Desenvolvimento de sistemas web com PHP Frameworks - Aula 2Desenvolvimento de sistemas web com PHP Frameworks - Aula 2
Desenvolvimento de sistemas web com PHP Frameworks - Aula 2Thyago Maia
 
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
 
Desenvolvimento de sistemas web com php Frameworks - Aula 1
Desenvolvimento de sistemas web com php Frameworks - Aula 1Desenvolvimento de sistemas web com php Frameworks - Aula 1
Desenvolvimento de sistemas web com php Frameworks - Aula 1Thyago Maia
 
Fluxo dinâmicos usando spring aplication
Fluxo dinâmicos usando spring aplicationFluxo dinâmicos usando spring aplication
Fluxo dinâmicos usando spring aplicationJeison Barros
 
Aula 09 - Instruções preparadas e otimização de consultas do Mysql - Program...
Aula 09  - Instruções preparadas e otimização de consultas do Mysql - Program...Aula 09  - Instruções preparadas e otimização de consultas do Mysql - Program...
Aula 09 - Instruções preparadas e otimização de consultas do Mysql - Program...Dalton Martins
 
Desenvolvimento de Apps e Games para Android - Parte 7
Desenvolvimento de Apps e Games para Android - Parte 7Desenvolvimento de Apps e Games para Android - Parte 7
Desenvolvimento de Apps e Games para Android - Parte 7Erisvaldo Junior
 

Semelhante a Substituir Request SFTP Mule (20)

Node JS - Parte 2
Node JS - Parte 2Node JS - Parte 2
Node JS - Parte 2
 
Threads 10: CompletableFuture
Threads 10: CompletableFutureThreads 10: CompletableFuture
Threads 10: CompletableFuture
 
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
 
Threads 08: Executores e Futures
Threads 08: Executores e FuturesThreads 08: Executores e Futures
Threads 08: Executores e Futures
 
Curso de Servlets
Curso de ServletsCurso de Servlets
Curso de Servlets
 
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
 
Aprofunde se no php 5.3
Aprofunde se no php 5.3Aprofunde se no php 5.3
Aprofunde se no php 5.3
 
Ajax O Objeto Xml Http Request Parte 4
Ajax   O Objeto Xml Http Request   Parte 4Ajax   O Objeto Xml Http Request   Parte 4
Ajax O Objeto Xml Http Request Parte 4
 
VRaptor - Alta produtividade no Desenvolvimento Web em Java
VRaptor - Alta produtividade no Desenvolvimento Web em JavaVRaptor - Alta produtividade no Desenvolvimento Web em Java
VRaptor - Alta produtividade no Desenvolvimento Web em Java
 
Servlets
ServletsServlets
Servlets
 
WebService Restful em Java
WebService Restful em JavaWebService Restful em Java
WebService Restful em Java
 
Mule esb teste parte 2
Mule esb teste   parte 2Mule esb teste   parte 2
Mule esb teste parte 2
 
API Apontador
API ApontadorAPI Apontador
API Apontador
 
Desenvolvimento de sistemas web com PHP Frameworks - Aula 2
Desenvolvimento de sistemas web com PHP Frameworks - Aula 2Desenvolvimento de sistemas web com PHP Frameworks - Aula 2
Desenvolvimento de sistemas web com PHP Frameworks - Aula 2
 
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
 
Desenvolvimento de sistemas web com php Frameworks - Aula 1
Desenvolvimento de sistemas web com php Frameworks - Aula 1Desenvolvimento de sistemas web com php Frameworks - Aula 1
Desenvolvimento de sistemas web com php Frameworks - Aula 1
 
Ajax como comecar
Ajax como comecarAjax como comecar
Ajax como comecar
 
Fluxo dinâmicos usando spring aplication
Fluxo dinâmicos usando spring aplicationFluxo dinâmicos usando spring aplication
Fluxo dinâmicos usando spring aplication
 
Aula 09 - Instruções preparadas e otimização de consultas do Mysql - Program...
Aula 09  - Instruções preparadas e otimização de consultas do Mysql - Program...Aula 09  - Instruções preparadas e otimização de consultas do Mysql - Program...
Aula 09 - Instruções preparadas e otimização de consultas do Mysql - Program...
 
Desenvolvimento de Apps e Games para Android - Parte 7
Desenvolvimento de Apps e Games para Android - Parte 7Desenvolvimento de Apps e Games para Android - Parte 7
Desenvolvimento de Apps e Games para Android - Parte 7
 

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
 
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
 
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
 
Começando com mulesoft e maven
Começando com mulesoft e mavenComeçando com mulesoft e maven
Começando com mulesoft e mavenJeison 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
 
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
 
Explorando mule esb sftp adapter
Explorando mule esb sftp adapterExplorando mule esb sftp adapter
Explorando mule esb sftp adapterJeison Barros
 

Mais de Jeison Barros (20)

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
 
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
 
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
 
Começando com mulesoft e maven
Começando com mulesoft e mavenComeçando com mulesoft e maven
Começando com mulesoft e maven
 
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
 
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
 
Explorando mule esb sftp adapter
Explorando mule esb sftp adapterExplorando mule esb sftp adapter
Explorando mule esb sftp adapter
 

Substituir Request SFTP Mule

  • 1. Substituindo o Request Message no Mule Ao trabalhar com os conectores de SFTP / FTP em Mule, pode ser necessário para substituir o conector, a fim de implementar a sua lógica personalizada. Isto pode ser útil quando a ordem de arquivos a serem processados é importante, por exemplo. Por exemplo, considere que, em seu caminho de arquivo de alguns ficheiros são ordenados usando um exemplo chave 'File_01.txt' e 'file_02.txt', e você deseja consumir arquivos de forma incremental ou seja, 'file_01.txt' deve ser processado antes ‘file_02.txt’. Implementando a lógica acima quando o endpoint SFTP funciona como um ponto de extremidade de entrada é bastante simples. Tudo que você precisa fazer é substituir o receptor da mensagem sobre o conector do SFTP com o seu código personalizado. <sftp:connector name="SFTP" validateConnections="true" doc:name="SFTP-Sorted" archiveDir="${sftp.jdeArchiveFilePath}" keepFileOnError="true" preferredAuthenticationMethods="publickey,password,keyboard- interactive"> <service-overrides messageReceiver="com.ricston.NewSftpReceiver"/> </sftp:connector> Por outro lado, quando o conector é chamada através de um ponto de extremidade de quartzo ou através do módulo solicitante o receptor da mensagem não será chamada, em vez do conector irá usar o solicitador de mensagem para recuperar o arquivo. Por esta razão, a substituição de serviço não pode ser utilizado, uma vez que não fornece uma maneira para substituir o solicitante. Neste post nós fornecemos um exemplo de trabalho de como isso pode ser feito. Uma maneira fácil de alcançar nosso objetivo é substituir as classes usadas pelo conector de SFTP. Para verificar exatamente quais classes estão sendo usados, vá para 'sftp.properties' encontrada no pote de mula-transport-sftp que vem com a distribuição mula que você está usando. Uma das propriedades listadas neste arquivo é o 'requester.factory ", que aponta para a classe' org.mule.transport.sftp.SftpMessageRequesterFactory '.
  • 2. Depois de analisar esta classe e as classes faz referência, você deve observar que o método dos getAvailableFiles 'está sendo usado para recuperar a lista de todos os arquivos presentes no diretório especificado; e isso é exatamente o método que deseja usar para retornar a lista dos arquivos ordenados. Isto é bastante fácil de fazer; criamos nosso costume SftpReceiverRequesterUtil que se estende 'SftpReceiverRequesterUtil' e substituir os getAvailableFiles () para incluir a lógica de classificação e retornar o primeiro arquivo na lista. package com.ricston.requester; import java.util.Arrays; import org.mule.api.endpoint.ImmutableEndpoint; import org.mule.transport.sftp.SftpReceiverRequesterUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SortedSftpReceiverRequesterUtil extends SftpReceiverRequesterUtil { private static final Logger logger = LoggerFactory .getLogger(SortedSftpReceiverRequesterUtil.class); public SortedSftpReceiverRequesterUtil(ImmutableEndpoint endpoint) { super(endpoint); }
  • 3. @Override public String[] getAvailableFiles(boolean onlyGetTheFirstOne) throws Exception { String[] availableFiles = super.getAvailableFiles(false); sortFiles(availableFiles); // Return first file in list only String[] firstFile = new String[1]; if (availableFiles.length > 1) { firstFile[0] = availableFiles[0]; return firstFile; } else { return availableFiles; } } private void sortFiles(String availableFiles[]) { int n = availableFiles.length; int k; for (int m = n; m >= 0; m--) { for (int i = 0; i < m - 1; i++) { k = i + 1; int firstBatchNumber = getBatchNumber(availableFiles[i]); int secondBatchNumber = getBatchNumber(availableFiles[k]); if (firstBatchNumber > secondBatchNumber) { swapFiles(i, k, availableFiles); } } } } private int getBatchNumber(String fileName) { return Integer.parseInt(fileName.substring( fileName.lastIndexOf("_") + 1, fileName.lastIndexOf(".")));
  • 4. } private void swapFiles(int i, int j, String[] availableFiles) { String temp; temp = availableFiles[i]; availableFiles[i] = availableFiles[j]; availableFiles[j] = temp; } } A fim de tornar o 'SftpMessageRequester' usar o nosso código, nós criamos nosso SftpMessageRequester personalizado que se refere ao nosso costume 'SftpReceiverRequesterUtil' criado na etapa anterior. Esta classe terá o mesmo comportamento como o "SftpMessageRequester ', mas em vez de instanciar' SftpReceiverRequesterUtil ', ele irá instanciar' SortedSftpReceiverRequesterUtil '. package com.ricston.requester; import java.io.InputStream; import org.mule.api.MuleMessage; import org.mule.api.endpoint.InboundEndpoint; import org.mule.api.transport.PropertyScope; import org.mule.transport.AbstractMessageRequester; import org.mule.transport.sftp.SftpConnector; import org.mule.transport.sftp.notification.SftpNotifier; public class CustomSftpMessageRequester extends AbstractMessageRequester { private SortedSftpReceiverRequesterUtil sftpRRUtil = null; public CustomSftpMessageRequester(InboundEndpoint endpoint) { super(endpoint); sftpRRUtil = new SortedSftpReceiverRequesterUtil(endpoint);
  • 5. } @Override protected MuleMessage doRequest(long timeout) throws Exception { String[] files = sftpRRUtil.getAvailableFiles(true); if (files.length == 0) return null; String path = files[0]; // TODO. ML FIX. Can't we figure out the current service (for // logging/audit // purpose)??? SftpNotifier notifier = new SftpNotifier((SftpConnector) connector, createNullMuleMessage(), endpoint, endpoint.getName()); InputStream inputStream = sftpRRUtil.retrieveFile(path, notifier); logger.debug("Routing file: " + path); MuleMessage message = createMuleMessage(inputStream); message.setProperty(SftpConnector.PROPERTY_ORIGINAL_FIL ENAME, path, PropertyScope.INBOUND); // Now we can update the notifier with the message notifier.setMessage(message); return message; } } Finalmente, queremos criar uma nova classe de fábrica com o mesmo comportamento como 'SftpMessageRequesterFactory ", mas em vez de
  • 6. retornar" SftpMessageRequester', ele irá retornar 'CustomSftpMessageRequester'. package com.ricston.requester; import org.mule.api.MuleException; import org.mule.api.endpoint.InboundEndpoint; import org.mule.api.transport.MessageRequester; import org.mule.transport.AbstractMessageRequesterFactory; public class CustomSftpMessageRequesterFactory extends AbstractMessageRequesterFactory { public MessageRequester create(InboundEndpoint endpoint) throws MuleException { return new CustomSftpMessageRequester(endpoint); } } Agora que estamos a fazer com o código, queremos substituir o conector de SFTP para que ele faz uso desta classe de fábrica recém-criada. Para fazer isso, usamos mola para substituir a propriedade 'requester.factory' encontrado em sftp.properties. <sftp:connector name="SFTP" validateConnections="true" doc:name="SFTP-Sorted" archiveDir="/archiveDir" keepFileOnError="true" preferredAuthenticationMethods="publickey,password,keyboard- interactive"> <spring:property name="serviceOverrides"> <spring:map> <spring:entry key="requester.factory" value="com.ricston.requester.CustomSftpMessageRequesterFactor y" /> </spring:map> </spring:property> </sftp:connector>
  • 7. Isso é tudo o que você precisa fazer para processar arquivos em ordem. Para testar isso, coloque dois arquivos ou mais em um diretório de sua escolha, e apontar o endpoint SFTP para este diretório. Note-se que para este trabalho o nome do arquivo deve terminar com; _number.extension (verifique getBatchNumber () in SortedSftpReceiverRequesterUtil.java). <?xml version="1.0" encoding="UTF-8"?> <mule xmlns:vm="http://www.mulesoft.org/schema/mule/vm" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:mulerequester="http://www.mulesoft.org/schema/mule/mule requester" xmlns:file="http://www.mulesoft.org/schema/mule/file" xmlns:sftp="http://www.mulesoft.org/schema/mule/sftp" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.6.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/sftp http://www.mulesoft.org/schema/mule/sftp/current/mule-sftp.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd http://www.mulesoft.org/schema/mule/mulerequester http://www.mulesoft.org/schema/mule/mulerequester/current/mule- mulerequester.xsd http://www.mulesoft.org/schema/mule/vm http://www.mulesoft.org/schema/mule/vm/current/mule-vm.xsd"> <sftp:connector name="SFTP" validateConnections="true" doc:name="SFTP-Sorted" archiveDir="/archiveDir"
  • 8. keepFileOnError="true" preferredAuthenticationMethods="publickey,password,keyboard- interactive"> <spring:property name="serviceOverrides"> <spring:map> <spring:entry key="requester.factory" value="com.ricston.requester.CustomSftpMessageRequesterFactor y" /> </spring:map> </spring:property> </sftp:connector> <sftp:endpoint name="SFTP-CustomerUpdate-FileEndpoint" host="localhost" user="user" password="pass" port="22" path="path" doc:name="SFTP" /> <http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration" /> <mulerequester:config name="Mule_Requester" doc:name="Mule Requester" /> <flow name="blogpostFlow"> <http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="HTTP" /> <mulerequester:request config-ref="Mule_Requester" resource="SFTP-CustomerUpdate-FileEndpoint" doc:name="Mule Requester" /> <logger level="INFO" doc:name="Logger" message="#[message.inboundProperties.originalFilename]" /> </flow> </mule> Traduzido de : https://www.ricston.com/blog/overriding-message- requester-mule/