SQS消息确认 [英] SQS message acknowledgement

查看:338
本文介绍了SQS消息确认的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆