SQS消息确认 [英] SQS message acknowledgement
问题描述
我的Sring Boot应用程序侦听Amazon SQS队列.现在,我需要实现正确的消息确认-我需要接收一条消息,仅在成功之后再做一些业务逻辑,如果成功的话,我需要确认该消息(从队列中删除该消息).例如,如果我的业务逻辑出错,则必须重新排队该消息.
My Sring Boot application listens Amazon SQS queue. Right now I need to implement correct message acknowledgement - I need to receive a message, do some business logic a only after that in case of success I need to ack the message(delete the message from the queue). For example, in case of error in my business logic the message must be re-enqueued.
这是我的SQS配置:
/**
* AWS Credentials Bean
*/
@Bean
public AWSCredentials awsCredentials() {
return new BasicAWSCredentials(accessKey, secretAccessKey);
}
/**
* AWS Client Bean
*/
@Bean
public AmazonSQS amazonSQSAsyncClient() {
AmazonSQS sqsClient = new AmazonSQSClient(awsCredentials());
sqsClient.setRegion(Region.getRegion(Regions.US_EAST_1));
return sqsClient;
}
/**
* AWS Connection Factory
*/
@Bean
public SQSConnectionFactory connectionFactory() {
SQSConnectionFactory.Builder factoryBuilder = new SQSConnectionFactory.Builder(
Region.getRegion(Regions.US_EAST_1));
factoryBuilder.setAwsCredentialsProvider(new AWSCredentialsProvider() {
@Override
public AWSCredentials getCredentials() {
return awsCredentials();
}
@Override
public void refresh() {
}
});
return factoryBuilder.build();
}
/**
* Registering QueueListener for queueName
*/
@Bean
public DefaultMessageListenerContainer defaultMessageListenerContainer() {
DefaultMessageListenerContainer messageListenerContainer = new DefaultMessageListenerContainer();
messageListenerContainer.setConnectionFactory(connectionFactory());
messageListenerContainer.setMessageListener(new MessageListenerAdapter(new MyQueueListener()));
messageListenerContainer.setDestinationName(queueName);
return messageListenerContainer;
}
我的队列侦听器:
public class MyQueueListener {
public void handleMessage(String messageContent) throws JMSException {
//do some job
//TODO: ack the message
}
}
现在我不知道如何确认来自听众的消息.
Right now I don't know how to ack the message from my listener.
推荐答案
通常DefaultMessageListenerContainer
会在执行handleMessage
之前或之后自动确认该消息.因此,您无需执行任何操作.
Normally DefaultMessageListenerContainer
acknowledges the message before or after execution of handleMessage
automatically. So you don't need to do anything.
但对于DefaultMessageListenerContainer
,建议使用事务而不是客户端ack模式.不确定Amazon SQS是否具有此类选项.
But recommended with DefaultMessageListenerContainer
is to use transactions instead of client ack mode. Not sure if Amazon SQS has such option.
这篇关于SQS消息确认的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!