Polling Consumer no SQS com Apache Camel
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.
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.