Utilizando Apache Camel para processar arquivos via FTP no Spring Boot

O Apache Camel é uma excelente solução para integrações de sistemas, onde além do projeto core que fornece diversos padrões de integrações, ele também disponibiliza uma série de subprojetos para integrações com tecnologias comuns como FTP, Mail, JMS, HTTP, entre outros.

A partir de 2015, o Camel começa a fornecer suporte ao Spring Boot seguindo o conceito de dependências starters (camel-spring-boot-starter), que quando adicionada essa dependência, o Apache Camel inicializa no startup da aplicação, devido o recurso de auto configuração do Spring Boot.

As dependências do Camel são bem modulares, dessa forma, é preciso adicionar o camel-spring-boot-starter para adicionar a dependência de integração com o Spring Boot e o Camel core e como vamos utilizar FTP, tem uma dependência específica para disponibilizar o suporte necessário para conectar ao servidor FTP.

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring-boot-starter</artifactId>
    <version>2.20.0</version>
</dependency>
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-ftp</artifactId>
    <version>2.20.0</version>
</dependency>

Após adicionado as dependências, no startup da aplicação será logado as configurações de rotas do Camel, as quais, são inicializadas no start do projeto.

INFO - [main] o.a.camel.spring.SpringCamelContext: Total 0 routes, of which 0 are started
INFO - [main] o.a.camel.spring.SpringCamelContext: Apache Camel 2.20.0 (CamelContext: camel-1) started in 10.104 seconds

Observação: Como nenhuma rota foi configurada, nenhuma rota foi inicializada.

O Camel utiliza o conceito de rotas para configurar seus fluxos de integrações, onde criamos uma classe que extende RouteBuilder e sobrescrevemos o método configure com a lógica de integração da rota, assim, essa rota deve configurar um fluxo de integração como no exemplo abaixo, onde a rota conecta no FTP, copia o arquivo para uma pasta temporária(local) e envia o arquivo para um bean de processamento, além disso, em caso de sucesso o arquivo é movido para pasta “sucesso” e em caso de erro para a pasta “erro” no FTP.

@Configuration
public class FtpRouter extends RouteBuilder {

	private static final String DELAY = "6000";

	@Autowired
	private FileProcessor fileProcessor;

	@Override
	public void configure() throws Exception {
		fromF("ftp://%s/%s?username=%s" +
						"&password=%s" +
						"&move=sucesso" +
						"&moveFailed=erro" +
						"&initialDelay=10000" +
						"&delay=%s" +
						"&binary=true" +
						"&localWorkDirectory=%s",
				"ftpHost",
				"arquivos"
				"user",
				"password",
				DELAY,
				"/tmp")
		.routeId("FtpRouter")
		.bean(fileProcessor, "process");
	}
}
  • fromF: Definição de rota que inicia a partir de uma URI;
  • ftp://: Protocolo utilizado para buscar o arquivo;
  • username: Usuário de acesso ao servidor FTP;
  • password: Senha de acesso ao servidor FTP;
  • move=sucesso: Configura a pasta para o arquivo ser movido em caso de sucesso no processo;
  • moveFailed=erro: Configura a pasta para o arquivo ser movido em caso de erro no processo;
  • initialDelay=10000: Tempo de espera para a rota não ser executada logo no startup da aplicação;
  • delay: Configura a periodicidade que a rota será executada;
  • binary=true: Configura o tipo de transferência;
  • localWorkDirectory: Configura a pasta que o arquivo será copiado local para que possa ser processado;
  • routeId: Define o Id da rota;
  • bean: Chama um determinado método de um Bean para processar o arquivo do carregado do FTP.

Mais configurações de ações ao FTP podem ser vista no site.

Seguindo o fluxo da Rota, após consumir o arquivo, ele precisa ser processado, dessa forma é chamado um bean para processar o arquivo e executar as ações de negócio.

@Component
public class FileProcessor {

	public void process(File file) {
		// TODO
	}
}

Observação: É uma boa prática separar a regra de processamento do arquivo da regra de configuração da rota de integração, por isso, é uma boa alternativa chamar um bean para processar o arquivo, porém, é importante saber que o bean de processamento será anexado ao fluxo de integração, ou seja, caso ocorra algum erro no processamento todo fluxo será considerado como falha.

Após configurado as rotas, são logados informações das rotas inicializadas.

INFO - [main] o.a.camel.spring.SpringCamelContext : Route: FtpRouter started and consuming from: ftp://ftpHost/arquivos?binary=true&delay=10000&initialDelay=10000&localWorkDirectory=%2Ftmp&move=processed&moveFailed=error&password=xxxxxx&username=user
INFO - [main] o.a.camel.spring.SpringCamelContext : Total 1 routes, of which 1 are started
INFO - [main] o.a.camel.spring.SpringCamelContext : Apache Camel 2.20.0 (CamelContext: camel-1) started in 14.280 seconds

Com isso, foi possível apresentar um pouco das funcionalidade do Apache Camel para integrações e ainda sua boa utilização conjunta com o Spring Boot através da dependência camel-spring-boot-starter, possibilitando simplicidade na configuração e boa separação de responsabilidades entre configuração e implementação de negócio.

Anúncios

Um comentário sobre “Utilizando Apache Camel para processar arquivos via FTP no Spring Boot

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.