Spring

구성 속성을 직접 넣지 않고 spring-boot @Scheduled에서 fixedDelayString 사용

기록만이살길 2021. 3. 9. 09:04
반응형

구성 속성을 직접 넣지 않고 spring-boot @Scheduled에서 fixedDelayString 사용

1. 질문(문제점):

여기 내 문제가 있습니다. @Scheduled내 스프링 부트 응용 프로그램에서 몇 가지 일반 작업을 수행하기 위해 몇 가지 방법 위에 사용 하고 있습니다.

일정을 구성하기 위해 다음과 같이 fixedDelayString& initialDelayString인수를 @Scheduled사용합니다.

@Scheduled(
      initialDelayString = "${my.wanted.delayInSeconds}",
      fixedDelayString = "${my.wanted.delayInSeconds}"
  )

그게 제대로 작동합니다.

내가 지금 가지고있는 문제는 응용 프로그램에 대한 속성 파일이입니다 필요 로 구성 등록 정보를 넣어 :

my.wanted.delayInSeconds=10

예를 들어 kebab-case와 같은 스프링 속성에 대해 다른 지원되는 경우를 사용하는 경우 :

my.wanted.delay-in-seconds=10

다음 예외와 함께 응용 프로그램이 부팅되지 않습니다.

Caused by: java.lang.IllegalStateException: Encountered invalid @Scheduled method 'myMethod': Could not resolve placeholder 'my.wanted.delayInseconds' in value "${my.wanted.delayInSeconds}"

그 값이 정의되지 않았고 스프링이 fixedDelayString& initialDelayString자리 표시 자에 대한 변환을 수행하지 않는 것 같기 때문에 의미가 있습니다 .

문제는 이것이 정말 깨지기 쉽다는 것입니다. 나는 일반적인 @ConfigurationProperties수업에서도 같은 속성을 읽고 있습니다. 그래서 IntelliJ는 속성 파일 즉 .NET에서 케밥 케이스 버전을 사용하도록 계속 제안합니다 my.wanted.delay-in-seconds. 그리고 나는 동의합니다-거기에서 읽는 것이 더 쉽습니다. 하지만 그렇게하면 앱이 부팅되지 않습니다.

그래서 제 질문은 :

  • 어느 쪽이든, 케밥 케이스도 작동하도록 Spring이 일반적인 변환을 수행합니까?
  • 또는 속성을 직접 사용하는 대신 구성 속성 클래스에서 지연 문자열을 제공 하시겠습니까?

감사!

2. 해결방안:

위의 @wjans 어노테이션에서 지적했듯이 내가 원하는 것을 달성하는 올바른 방법은 SEL을 사용하여 내 속성 빈에서 빈 속성을 가져와 @Scheduled인수에 사용하는 것입니다 .

이렇게 :

@Scheduled(
      initialDelayString = "#{@myProps.getSchedulingDelayMillis()}",
      fixedDelayString = "#{@myProps.getSchedulingDelayMillis()}"
  )

이것은 속성 클래스에서 지연 문자열을 가져 오므로 필요한 모든 것을 해당 속성에 바인딩하고 사용할 수 있습니다.

65624637
반응형