问题
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.
This is my SQS config:
/**
* 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;
}
My queue listener:
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.
回答1:
Normally DefaultMessageListenerContainer
acknowledges the message before or after execution of handleMessage
automatically. So you don't need to do anything.
But recommended with DefaultMessageListenerContainer
is to use transactions instead of client ack mode. Not sure if Amazon SQS has such option.
来源:https://stackoverflow.com/questions/32300337/sqs-message-acknowledgement