首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的Spring应用程序没有显示JMSHealthIndicator?

为什么我的Spring应用程序没有显示JMSHealthIndicator?
EN

Stack Overflow用户
提问于 2017-09-05 09:33:37
回答 2查看 1.7K关注 0票数 1

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

当我在localhost:8081/health上访问内置的Spring健康端点时,我希望看到一些关于JMS的信息,因为弹簧启动文件说“在适当的时候”配置了一些自动配置的健康指示符,其中之一就是JMS。相反,我只看到状态和磁盘空间{"status":"UP","diskSpace":{"status":"UP","total":31572619264,"free":24611381248,"threshold":10485760}}

有人知道为什么我们在健康端点上看不到任何关于JMS的信息吗?应用程序可以很好地读取SQS,但是由于它是在Kubernetes中托管的,所以我想添加一个就绪/活性探测,并在检查中包含JMS。

有关使用@EnableJms的JMS的信息,如下所示

代码语言:javascript
复制
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中

代码语言:javascript
复制
management.health.defaults.enabled=true
management.health.jms.enabled=true
endpoints.health.sensitive=false

谢谢,莉安。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-05 12:40:20

结果是,现在将连接工厂公开为bean将导致健康响应中的JMS部分。

因此,通过将代码更改为

代码语言:javascript
复制
@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);
}

}

健康端点响应如下所示

代码语言:javascript
复制
{
"status": "UP",
"jms": {
    "status": "UP",
    "provider": "Amazon"
},
"diskSpace": {
    "status": "UP",
    "total": 249779191808,
    "free": 165159432192,
    "threshold": 10485760
}
}

在看到JmsHealthIndicator的构造函数后,一位同事预感到连接工厂是不可访问的。

票数 3
EN

Stack Overflow用户

发布于 2017-09-05 11:19:09

我认为您可能需要向您的application.properties文件添加进一步的属性:

代码语言:javascript
复制
management.security.enabled=false

根据文件:

默认情况下,所有敏感的HTTP端点都是安全的,因此只有具有执行器角色的用户才能访问它们。安全性使用标准的HttpServletRequest.isUserInRole方法强制执行。 如果您在防火墙后部署应用程序,您可能更希望您的所有执行器端点都可以被访问,而不需要身份验证。您可以通过更改management.security.enabled属性来做到这一点。

在这里可以看到更多关于这个的信息:https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-monitoring.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46051652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档