AWS SQS, DLQ en Spring Boot
¿Cómo agrego una configuración DLQ a mi configuración SQS? No estoy seguro de cómo integrar una DLQ con mi cola existente. Estoy usando mensajes de aws y no JMS, por lo que mi anotación sería @SQSListener
para mi método oyente. Tengo una clase de configuración que tiene lo siguiente:
@Bean
public SimpleMessageListenerContainer messageListenerContainer(AmazonSQSAsync amazonSQSAsync) {
SimpleMessageListenerContainerFactory factory = new SimpleMessageListenerContainerFactory();
factory.setAmazonSqs(amazonSQSAsync);
factory.setMaxNumberOfMessages(10);
SimpleMessageListenerContainer simpleMessageListenerContainer = factory.createSimpleMessageListenerContainer();
simpleMessageListenerContainer.setQueueStopTimeout(queueStopTimeout*1000);
simpleMessageListenerContainer.setMessageHandler(messageHandler(amazonSQSAsync));
return simpleMessageListenerContainer;
}
@Bean
public QueueMessageHandler messageHandler(AmazonSQSAsync amazonSQSAsync) {
QueueMessageHandlerFactory queueMessageHandlerFactory = new QueueMessageHandlerFactory();
queueMessageHandlerFactory.setAmazonSqs(amazonSQSAsync);
QueueMessageHandler messageHandler = queueMessageHandlerFactory.createQueueMessageHandler();
return messageHandler;
}
@Bean
public AmazonSQSAsync awsSqsAsync() {
AmazonSQSAsyncClient amazonSQSAsyncClient = new AmazonSQSAsyncClient(new DefaultAWSCredentialsProviderChain());
amazonSQSAsyncClient.setRegion(Region.getRegion(Regions.fromName(region)));
return new AmazonSQSBufferedAsyncClient(amazonSQSAsyncClient);
}
No pude encontrar ninguna documentación correcta para configurar adecuadamente los reintentos para que, si los reintentos superan el umbral, el mensaje debería ir a una cola de mensajes no entregados.
davy.ai
Para agregar una configuración de cola de mensajes no entregables (Dead-Letter Queue o DLQ) a su configuración de SQS, debe modificar su código existente siguiendo los siguientes pasos:
createQueue
en el clienteAmazonSQSAsync
y pasando un objetoCreateQueueRequest
con el atributoqueueName
establecido en el nombre deseado de su DLQ. Anote el ARN (Nombre de Recurso de Amazon) de su DLQ que obtiene en la respuesta.A continuación, debe modificar la creación del bean
QueueMessageHandler
para establecer la propiedadmessageHandler
con un nuevo objetoDefaultMessageHandlerMethodFactory
que tiene un métodosetDeadLetterQueueName
llamado con el nombre de la DLQ creada previamente. También debe establecer la propiedadsetMessageConverters
con cualquier convertidor de mensaje que esté utilizando.SimpleMessageListenerContainerFactory
para establecer el métodosetDeadLetterQueueName
llamado con el nombre de la DLQ creada previamente. También debe establecer la propiedadsetBatchErrorHandler
con un nuevo objetoBatchErrorHandler
que tiene una sobreescritura del métodohandle
que toma una lista de argumentosThrowable
, registra los errores y arroja el último.Después de modificar su código con estos pasos, su método oyente consumirá mensajes de la cola de SQS y, si los reintentos exceden el umbral, el mensaje se moverá a la cola de mensajes no entregables (Dead Letter Queue o DLQ) para su análisis adicional.