25%OFF no 1º ano | 50%OFF No 2º ano

Últimos dias!

Últimos dias!

00

DIAS

00

HORAS

00

MIN

00

SEG

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 Black Friday da Alura com destaque para até 50% de desconto em cursos, válido até 29/11. Transforme a sua carreira com o maior desconto do ano, matricule-se já!
 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