Polling Consumer no SQS com Apache Camel

Polling Consumer no SQS com Apache Camel
Natanael Pantoja
Natanael Pantoja

Compartilhe

Quando falamos de integração de sistemas, não podemos deixar passar o conceito de  mensageria, extremamente útil quando tratamos de integração de sistemas.  No curso de SOA apresentamos o Apache Camel, um excelente framework de integração que implementa diversos padrões que nos ajudam bastante no dia a dia de um grande projeto. Sempre comento com os alunos que entender desses padrões é essencial para quem se aprofundar no mundo da integração de sistemas. Uma pergunta frequente é se consigo fazer o polling de mensagens no SQS, que inclusive já falei dele anteriormente.

Com o apache Camel é muito simples, pois ele já disponibiliza diversos componentes, Entre eles, há uma lista específica para os serviços da Amazon.

Vamos começar criando nossas credenciais na Amazon AWS e nosso cliente do SQS.

Banner da Escola de Programação: Matricula-se na escola de Programação. Junte-se a uma comunidade de mais de 500 mil estudantes. Na Alura você tem acesso a todos os cursos em uma única assinatura; tem novos lançamentos a cada semana; desafios práticos. Clique e saiba mais!
 AWSCredentials awsCredentials = new BasicAWSCredentials("myAccessKey", "mySecretKey"); AmazonSQS client = new AmazonSQSClient(awsCredentials); 

Este cliente tem que ser registrado via JNDI para que fique visível ao componente do Camel.

 JndiRegistry registry = new JndiRegistry(); registry.bind("sqsClient", client); 

Logo após podemos criar nosso Contexto para que nossas rotas possam ser executadas.

 DefaultCamelContext ctx = new DefaultCamelContext(registry); 

Iremos criar nossas rotas usando a DSL que o Camel disponibiliza para não ter que usar XML.

 public class SQSRouteBuilder extends RouteBuilder { public void configure() { from("aws-sqs://caelumQueue?amazonSQSClient=#sqsClient&deleteIfFiltered=false") //.filter(simple("${header.identity} == 'login'")) .log("We have a message! ${body}") .process(new Processor() { @Override public void process(Exchange exchange) throws Exception { String messagestring = exchange.getIn().toString(); System.out.println("messagestring : " + messagestring); } }) .to("file:target?fileName=sqs-msg.xml"); }

} 

Explicando um pouco mais a DSL, basicamente, estou passando o padrão de URI do Camel (aws-sqs://queue-name```?options )

amazonSQSClient: Parêmetro que foi registrado via JNDI.  Com isso o componente vai conseguir se conectar ao SQS e fazer o consumo da fila.

Vale lembrar que temos que passar o # antes do nome registrado.

 registry.bind("sqsClient", client); 

deleteIfFiltered: Esse parâmetro é importante, pois, diferentemente de outros MOM, o SQS não faz FIFO (First In First Out) e a responsabilidade de remover a mensagem é totalmente sua.

Agora é adicionar essa rota ao nosso contexto e testar. Não esqueça que para esse exemplo funcionar você precisa configurar seu ambiente na Amazon.

 ctx.addRoutes(new SQSRouteBuilder()); ctx.start(); Thread.sleep(100000); 

Você pode entender melhor a DSL do Camel com outro artigo publicado aqui. E ler todas as opções que você tem para usar na rota do SQS aqui.

Se está usando Maven, precisará das dependências do SQS e do SDK da Amazon.


<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-aws</artifactId> <version>2.14.1</version> </dependency>

<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk</artifactId> <version>1.9.13</version> </dependency> 

Você também vai precisar configurar seu contexto JNDI. Crie um arquivo chamado. jndi.properties com o seguinte conteudo.

 java.naming.factory.initial = org.apache.camel.util.jndi.CamelInitialContextFactory 

O projeto completo você pode encontrar no meu Github.

Veja outros artigos sobre Programação