Проверка работоспособности Spring Boot - Наследование - PullRequest
1 голос
/ 11 марта 2020

Я пытаюсь использовать пружинный привод для проверки работоспособности. У меня есть несколько URL-адресов, для которых мне нужно выполнить проверку здоровья, но способы их вызова очень похожи. Я пытался создать базовый класс, который реализует классы healthindicator и дочерние классы, которые простираются от base, которые передают фактический URL и затем вызывают метод health. Есть ли лучший способ сделать это?

Базовый класс проверки здоровья

@Component
public class BaseHealthCheck implements HealthIndicator{

    private String url;

    @Override
    public Health health() {
        // call url
        return Health.up().build();
    }

    private void setUrl(String url){
       this.url = url
    }

}

Дочерний класс 1

@Component
public class Child1HealthCheck extends BaseHealthCheck {

    @Value("${childurl1}")
    private String url;

    @Override
    public Health health() {
        super.health();
    }

    @PostConstruct
    private void setUrl(){
       super.setUrl(url);
    }

}

Детский класс 2

@Component
public class Child2HealthCheck extends BaseHealthCheck {

    @Value("${childurl2}")
    private String url;

    @Override
    public Health health() {
        super.health();
    }

    @PostConstruct
    private void setUrl(){
       super.setUrl(url);
    }

}

1 Ответ

1 голос
/ 11 марта 2020

Два основных недостатка вашего решения IMHO - это то, что вам нужен новый класс для каждой новой проверки работоспособности и использование полевой инъекции . Другим способом реализации этого было бы следующее.

Я создал простой класс для «бизнес-логики c». Этот класс реализует HealthIndicator и не является управляемым компонентом Spring. Он получает все необходимые зависимости от конструктора, чтобы избежать внедрения поля.

public class CustomHealthCheck implements HealthIndicator {

    private final String url; // use URL or URI instead of String?

    public CustomHealthCheck(String url) {
        this.url = url;
    }

    @Override
    public Health health() {
        // call url
        return Health.up().build();
    }
}

Чтобы заставить их работать с Spring, я создал класс конфигурации, который создает бины Spring. Таким образом, нет необходимости создавать новый класс для каждой новой проверки работоспособности, имеющий те же логики c, что и существующий, только новый метод внутри этого класса.

@Configuration
public class CustomHealthChecks {

    @Bean
    public CustomHealthCheck firstHealthCheck(@Value("${url1}") String url) {
        return new CustomHealthCheck(url);
    }

    @Bean
    public CustomHealthCheck secondHealthCheck(@Value("${url2}") String url) {
        return new CustomHealthCheck(url);
    }
}

И простой тест для убедитесь, что у меня есть два объекта HealthIndicator в моем весеннем контексте.

@Test
public void produces_expected_health_indicators() {
    ApplicationContextRunner runner = new ApplicationContextRunner();
    runner.withPropertyValues("url1=https://stackoverflow.com/", "url2=https://start.spring.io/")
          .withUserConfiguration(CustomHealthChecks.class)
          .run(context -> {
        assertThat(context).getBeans(HealthIndicator.class).hasSize(2);
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...