java - 为什么我的带有 SQS 的 Spring Boot 应用程序不显示 JMSHealthIndicator?

标签 java amazon-web-services spring-boot spring-jms

我正在开发一个 Spring Boot 应用程序,该应用程序从 SQS 获取消息,如本文 https://aws.amazon.com/blogs/developer/using-amazon-sqs-with-spring-boot-and-spring-jms/ 中所述。

当我访问 localhost:8081/health 内置的 Spring Boot 运行状况端点时,我希望看到有关 JMS 代理的一些信息,如 Spring Boot docs假设有一些自动配置的运行状况指示器,这些指示器是“在适当的时候”配置的,其中之一是 JmsHealthIndicator 。相反,我只看到状态和磁盘空间 {"status":"UP","diskSpace":{"status":"UP","total":31572619264,"free":24611381248,"threshold":10485760 }}

有谁知道为什么我们在运行状况端点上看不到任何有关 JMS 的信息?该应用程序可以很好地从 SQS 读取数据,但由于它托管在 Kubernetes 中,我想添加一个就绪/活跃度探测器并在检查中包含 JMS。

有关信息,我们使用 @EnableJms 的 JMS 配置如下

import javax.jms.Session;

import com.amazon.sqs.javamessaging.SQSConnectionFactory;
import com.amazonaws.auth.AWSCredentialsProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.aws.core.region.RegionProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.support.destination.DynamicDestinationResolver;

@Configuration
@EnableJms
public class JmsConfig {

private static final Logger LOGGER = LoggerFactory.getLogger(JmsConfig.class);
private static final String LOWER_UPPER_CONCURRENCY = "3-10";

private final SQSConnectionFactory connectionFactory;

public JmsConfig(RegionProvider regionProvider, AWSCredentialsProvider awsCredentialsProvider) {
    this.connectionFactory = SQSConnectionFactory.builder()
            .withRegion(regionProvider.getRegion())
            .withAWSCredentialsProvider(awsCredentialsProvider)
            .build();
    LOGGER.info("Loading JmsConfig");
}

@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
    DefaultJmsListenerContainerFactory factory =
            new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(this.connectionFactory);
    factory.setDestinationResolver(new DynamicDestinationResolver());
    factory.setConcurrency(LOWER_UPPER_CONCURRENCY);
    factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
    return factory;
}

@Bean
public JmsTemplate defaultJmsTemplate() {
    return new JmsTemplate(this.connectionFactory);
}

}

然后我们还有一个用 @JmsListener(destination = "${sqs.input.queue}") 注释的方法

编辑:请注意,我已经尝试将以下内容添加到 application.properties

management.health.defaults.enabled=true
management.health.jms.enabled=true
endpoints.health.sensitive=false

谢谢, 莉安。

最佳答案

事实证明,将连接工厂公开为 bean 现在会在运行状况响应中生成 JMS 部分。

因此将代码更改为这样

@Configuration
@EnableJms
public class JmsConfig {

private static final Logger LOGGER = LoggerFactory.getLogger(JmsConfig.class);
private static final String LOWER_UPPER_CONCURRENCY = "3-10";

public JmsConfig() {
    LOGGER.info("Loading JmsConfig");
}

@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(SQSConnectionFactory connectionFactory) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    factory.setDestinationResolver(new DynamicDestinationResolver());
    factory.setConcurrency(LOWER_UPPER_CONCURRENCY);
    factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
    return factory;
}

@Bean
public SQSConnectionFactory sqsConnectionFactory(RegionProvider regionProvider, AWSCredentialsProvider awsCredentialsProvider) {
    return SQSConnectionFactory.builder()
            .withRegion(regionProvider.getRegion())
            .withAWSCredentialsProvider(awsCredentialsProvider)
            .build();
}

@Bean
public JmsTemplate defaultJmsTemplate(SQSConnectionFactory connectionFactory) {
    return new JmsTemplate(connectionFactory);
}

}

健康端点响应如下所示

{
"status": "UP",
"jms": {
    "status": "UP",
    "provider": "Amazon"
},
"diskSpace": {
    "status": "UP",
    "total": 249779191808,
    "free": 165159432192,
    "threshold": 10485760
}
}

一位同事在看到 JmsHealthIndicator 的构造函数后有一种预感连接工厂无法访问。

关于java - 为什么我的带有 SQS 的 Spring Boot 应用程序不显示 JMSHealthIndicator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46051652/

相关文章:

amazon-web-services - 无法连接到端口 22 上的 AWS 实例

node.js - AWS多SQS队列和workers优化设计

javascript - 用于视频文件的 AWS S3 和 Cloudfront CDN

java - :if statement in Thymeleaf 的 OR 条件

java - 运行 mvn install/mvn test 时出现 Maven mapstruct 问题

java - Google App Engine Java 更新权限检查错误

java - 如何将 MS Access 数据库与 Java 8 连接?

Java For-Each 循环处理多手牌

java - 集合中的所有字符组合以创建字符串

spring-boot - Spring Boot 2.x Repackage用于与Gradle的集成测试