2017-09-05 53 views
1

我工作的一個春天啓動應用程序,從SQS採用郵件作爲對這個職位https://aws.amazon.com/blogs/developer/using-amazon-sqs-with-spring-boot-and-spring-jms/爲什麼我的SQS的Spring Boot應用程序不顯示JMSHealthIndicator?

描述當我訪問在localhost:8081/health內置的彈簧引導健康端點我希望看到有關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 

謝謝, Leanne。

回答

2

事實證明,露出連接工廠作爲一個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,連接工廠是不是以後有預感無障礙。

0

我想你可能需要進一步的屬性添加到您的application.properties文件:

management.security.enabled=false 

根據文檔:

默認情況下,所有的敏感HTTP端點保護,因此只有 用戶具有ACTUATOR角色的用戶可以訪問它們。安全使用標準HttpServletRequest.isUserInRole方法

如果部署在防火牆後面的應用程序執行 ,你可能更喜歡 您所有的執行端點可以無需 認證訪問。您可以通過改變 management.security.enabled屬性來完成這個

查看更多有關此位置:https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-monitoring.html

+0

謝謝你的建議,但我們已經有了這樣的設置,這只是我不包括在這個問題中。我們現在有它的工作,所以我會發布答案:) – Leanne182x

相關問題