SQS消息确认

3

我的Spring Boot应用程序监听Amazon SQS队列。现在我需要实现正确的消息确认 - 我需要接收一条消息,执行一些业务逻辑,只有在成功的情况下才需要确认消息(从队列中删除消息)。例如,在我的业务逻辑出现错误的情况下,必须重新将消息加入队列。

这是我的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
    }
}

现在我不知道如何从我的监听器中确认消息。

1个回答

3
通常情况下,DefaultMessageListenerContainer 会在自动执行 handleMessage 前后自动确认消息。因此您不需要做任何操作。
但是,建议使用事务而不是客户端确认模式来使用 DefaultMessageListenerContainer。不确定亚马逊 SQS 是否有这样的选项。

那么在我的情况下,使用SQS中的确认方式的正确方法是什么?(从你的回答中并不清楚)? - alexanoid
我认为你不必担心显式确认。Spring通常会为您完成这项工作。 - luboskrnac
你们知道如何发送明确的失败信息吗? - codebusta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接