2017-12-18 5 views
1

스프링 부트 자동 구성 @EnableScheduling을 사용하여 cron 작업을 만들려고합니다. fixedRateString이 하드 코드 된 경우 작업이 완벽하게 작동합니다. 그러나 SpEL을 사용하여 값을 제공하려고 시도하면 성공하지 못합니다.SpEL이 인스턴스 변수에 액세스 할 수 없습니다.

// 콩 인스턴스화 JavaConfig에서

@Bean 
public AlertbotJob2 getAlertJob2() { 
    AlertbotJob2 alertbotJob2 = new AlertbotJob2("alertId", "alertName", "alertSubject", "6000", true); 
    return alertbotJob2; 
} 

콩 정의

public class AlertbotJob2 { 

String alertId; 
String alertName; 
String alertSubject; 
public String cronPattern; 
boolean isActive; 

public AlertbotJob2() { 
} 

public AlertbotJob2(String alertId, String alertName, String alertSubject, String cronPattern, boolean isActive) { 
    super(); 
    this.alertId = alertId; 
    this.alertName = alertName; 
    this.alertSubject = alertSubject; 
    this.cronPattern = cronPattern; 
    this.isActive = isActive; 
} 

@Scheduled(initialDelay = 60000, fixedRateString = "#{this.cronPattern}") 
public void doTheJob() { 
    System.out.println("DoSomething"); 
} 

}

예외는 :: 구문 분석에 실패했습니다. 중첩 예외는 org.springframework.expression.spel.SpelEvaluationException입니다 : EL1008E : 'org.springframework.beans.factory.config.BeanExpressionContext'유형의 객체에서 'this'속성 또는 필드를 찾을 수 없습니다 - public이 아닐 수도 있습니까?

저는 트리거 값을 동적으로 설정하려고합니다. 도와주세요.

답변

0

이렇게 SpEL을 사용할 수 있다고 생각하지 않습니다.

myapp.scheduler.cronPattern=... 

그리고 다음 구문을 사용합니다 :

@Scheduled(cron = "${myapp.scheduler.cronPattern}") 
public void doTheJob() { 
    ... 
} 
0

당신이 this을 사용할 수 없습니다를 은 아마 더 좋은 방법은 같은 몇 가지 특성에 크론 패턴을 정의하는 것입니다.

빈 이름은 @someBean.cronPattern이어야합니다.

+0

음, 그 방법을 시도했지만 제대로 작동하지 않았습니다. 데이터베이스 구성을 읽은 후 프로그램 방식으로 bean을 작성하고 있습니다. 프로토 타입 범위로 **@someBean**.cronPattern을 만들 수 있는지 알아야합니다. – zikzakjack

+0

아니요; SpEL 표현식이 주석이 상주하는 클래스의 인스턴스를 직접 참조 할 수있는 방법은 없습니다. –

0

용액 1 : 경우 하드 패턴을 사용하여 그 이미 공지 @Scheduled (크론 = "0 0/5 * * * MON-FRI")

해결책 2 : 패턴은 어떤 속성 사용할 경우 @Scheduled (cron = "$ {myapp.scheduler.cronPattern}")

해결 방법 3 :이 방법은 주석을 사용하지 않습니다. 대신 Bean을 실행 파일로 구현 한 다음 SchedulingConfigurer.configureTasks()를 재정 의하여 taskRegistrar.addCronTask (urRunnableJob, urCronPatternFromDB)를 사용하여 동적으로 스케줄을 설정하십시오. . 크론 패턴은 데이터베이스 테이블에 저장되어 아래와 같이 속성으로 초기화됩니다.

class AppConfig { 

    @Autowired 
    ConfigurableEnvironment environment; 

    private void initPropertiesMap() { 
     environment.getPropertySources() 
      .addLast(new MapPropertySource("myAppProperties", myAppProperties.getProperties())); // Prior DAO call required to read the configs from database 
    } 

    @PostConstruct 
    public void postConstruct() { 
     initPropertiesMap(); 
    } 

} 
관련 문제