【问题标题】:Spring Boot Health Check - SQS ConsumerSpring Boot 健康检查 - SQS 消费者
【发布时间】:2018-05-11 22:53:33
【问题描述】:

SQS 是否有 Spring Boot Actuator Health Check 端点?我已经建立了一个 SQS 消费者,我想检查 SQS 是否已启动并正在运行。我没有使用 JMSlistener 连接到 SQS,而是使用 Spring Cloud Libraries。

我实现了以下健康检查端点。当我删除队列并尝试点击运行状况检查端点时,这将返回以下错误。如果存在连接问题或 SQS 服务出现故障,我是否会收到类似的错误,最终导致运行状况检查端点失败?

com.amazonaws.services.sqs.model.QueueDoesNotExistException: 此 wsdl 版本不存在指定的队列。 (服务: 亚马逊SQS;状态码:400;错误代码: AWS.SimpleQueueService.NonExistentQueue;请求编号: cd8e205d-dc43-535e-931f-7332733bd16c)

public class SqsQueueHealthIndicator extends AbstractHealthIndicator {

    private final AmazonSQSAsync amazonSQSAsync;
    private final String queueName;

    public SqsQueueHealthIndicator(AmazonSQSAsync amazonSQSAsync, String queueName) {
        this.amazonSQSAsync = amazonSQSAsync;
        this.queueName = queueName;
    }

    @Override
    protected void doHealthCheck(Health.Builder builder) {
        try {
            amazonSQSAsync.getQueueUrl(queueName);
            builder.up();
        } catch (QueueDoesNotExistException e) {
            e.printStackTrace();
            builder.down(e);
        }
    }

}

豆类

@Bean
SqsQueueHealthIndicator queueHealthIndicator(@Autowired AmazonSQSAsync amazonSQSAsync, @Value("${sqs.queueName}") String queueName) {
    return new SqsQueueHealthIndicator(amazonSQSAsync, queueName);
}

@Bean
SqsQueueHealthIndicator deadLetterQueueHealthIndicator(@Autowired AmazonSQSAsync amazonSQSAsync, @Value("${sqs.dlQueueName}") String deadLetterQueueName) {
    return new SqsQueueHealthIndicator(amazonSQSAsync, deadLetterQueueName);
}

【问题讨论】:

    标签: java spring amazon-web-services spring-boot spring-boot-actuator


    【解决方案1】:

    您必须编写如下自定义运行状况检查,通过使用AWS Java SDK lib 调用getQueueUrl 来检查您的队列是否存在。

        @Component
    public class SQSHealthCheck implements HealthIndicator {
        @Override
        public Health health() {
            int errorCode = check(); // perform some specific health check
            if (errorCode != 0) {
                return Health.down()
                  .withDetail("Error Code", errorCode).build();
            }
            return Health.up().build();
        }
    
        public int check() {
            /**
            your logic to check queue exists or not using by calling getQueueUrl . e.g you will get queue url of a queue named "SampleQueue" like https://sqs.us-east-1.amazonaws.com/12XXX56789XXXX/SampleQueue
            **/
            return 0; // 0 or 1 based on result
        }
        }
    

    【讨论】:

    • 谢谢。我想使用spring cloud库,想根据sqslistener是否收到并处理消息来检查状态
    • 抱歉,我添加了其他信息。我没有清楚地说明我的问题。我只是想看看这个实现是否足够,或者我是否应该做更多的事情。感谢您的帮助。
    • 是的。这是我所指的正确方法。关于 "QueueDoesNotExistException" ,请确保您使用正确的凭据传递这样的正确队列。 sqs.{aws zone}.amazonaws.com/{you_AWS_account}/{Queue_Name}。您可以使用 AWS CLI 执行相同的 AWS 操作,检查此运行状况方法中缺少哪些参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2020-03-15
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多