我正在开发一个 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
谢谢,莱恩。
事实证明,将连接工厂公开为 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] 删除。
我来说两句