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

Leanne182x

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

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

有谁知道为什么我们在健康端点上看不到任何关于 JMS 的信息?该应用程序从 SQS 读取工作正常,但由于它托管在 Kubernetes 中,我想添加一个就绪/活跃度探测器并在检查中包含 JMS。

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

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

谢谢,莱恩。

Leanne182x

事实证明,将连接工厂公开为 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的构造函数后有一种预感,即连接工厂不可访问。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么Spring Boot在打包时不加载应用程序yml(带有gradle)?

为什么我的Spring应用程序从Spring Boot单元测试中运行

带有Apache轴的Spring Boot应用程序

带有 Jquery ajax 的 Spring Boot 应用程序

为什么Spring Boot应用程序需要hikariCP?

为什么我在Spring-boot应用程序中通过SessionFactory具有循环依赖关系?

为什么我的带有表组件的React应用程序不显示所有记录?

为什么我的 Spring Boot Web 应用程序无法加载其配置属性?

为什么我收到错误“默认包中的 Spring Boot 应用程序”

为什么我的Spring Boot应用程序首先失败,然后突然在cloudfoundry中启动?

为什么我的 Spring Boot 应用程序不在 mustache 模板中呈现 messages.properties

为什么我的Spring Boot Web应用程序不能在Gradle中完全运行?

为什么我在Spring Boot应用程序中遇到未找到错误的错误

为什么我的 Spring Boot 应用程序即使在配置后也不会启动执行器

为什么AOP在我的Spring Boot应用程序中不起作用?

为什么我的简单 Spring Boot 应用程序无法在 Heroku 上部署?

为什么Redis Cache在Spring Boot应用程序中没有变空?

为什么我的Redis缓存不能在Spring-Boot / Spring-Data应用程序中工作?

如何正确配置我的 Spring Boot 应用程序?

运行我的Spring Boot应用程序时伪装UnsatisfiedDependecyException

Intellij找不到我的Spring Boot应用程序

什么可以从 Spring Boot 应用程序中排除?

从Spring Boot应用程序运行KSQL的方式是什么

具有实时通信功能的 Spring Boot 应用程序

在角度应用程序中显示Spring Boot异常

Spring Boot Web Starter 应用程序显示错误

图像未显示在 Spring Boot 应用程序的网页上

在Spring Boot应用程序中将带有作业定义的Spring Batch Admin嵌入

在amazon sqs,alpine sqs spring boot中分批使用消息