2015-01-07 4 views
2

저는 Java EE의 새로운 사용자이며 정기적으로 날씨를 업데이트해야하는 응용 프로그램을 개발 중입니다. 5 분마다 업데이트하기 위해 주석을 사용하여 자동 타이머를 만들었습니다. 나는 (관리자가 변경할 수 있습니다) dinamically 시간을 변경하려면 :자동 타이머 @Schedule Java EE

@Schedule(minute="*/5",hour = "*", persistent = false) 
public void weatherUpdate(){ 
} 

나는 날씨 업데이트 빈도를 포함하는 정수 변수라는 주파수가 필요합니다. 이런 식으로 시도했지만 작동하지 않았습니다.

int freq=5; 

@Schedule(minute="*/freq",hour = "*", persistent = false) 
public void weatherUpdate(){ 
} 

해결책을 알고 있습니까?

답변

0

가능한 해결 방법은 TimerService입니다. 예를 들어 프로그래밍 방식의 타이머를 만들 수 있습니다.

예 :

@Singleton 
@Startup 
public class ProgrammaticTimer { 

    @Resource 
    TimerService timerService; 

    public void createTimer(String timerId, int frec){ 
     ScheduleExpression expression = new ScheduleExpression(); 
     expression.minute("*/"+freq).hour("*"); 
     timerService.createCalendarTimer(expression, new TimerConfig(timerId, true)); 
    } 

    @Timeout 
    public void execute(){ 
     System.out.println("----Invoked: " + System.currentTimeMillis()); 
    } 
} 

먼저 현재의 타이머를 취소하고 새 값으로 새로운 타이머를 만들 필요 타이머의 주파수를 편집합니다.

예 :

@Singleton 
@Startup 
public class ProgrammaticTimer { 

    @Resource 
    TimerService timerService; 

    public void createTimer(String timerId, int freq){ 
     ScheduleExpression expression = new ScheduleExpression(); 
     expression.minute("*/"+freq).hour("*"); 
     timerService.createCalendarTimer(expression, new TimerConfig(timerId, true)); 
    } 

    public void editTimer(String timerId, int freq){ 
     cancelTimer(timerId) 
     ScheduleExpression expression = new ScheduleExpression(); 
     expression.minute("*/"+freq).hour("*"); 
     timerService.createCalendarTimer(expression, new TimerConfig(timerId, true)); 
    } 

    public void cancelTimer(String timerId) { 
     if (timerService.getTimers() != null) { 
      for (Timer timer : timerService.getTimers()) { 
       if (timer.getInfo().equals(timerId)) { 
        timer.cancel(); 
       } 
      } 
     } 
    } 

    @Timeout 
    public void execute(){ 
     System.out.println("----Invoked: " + System.currentTimeMillis()); 
    } 
} 

은 참조 : Using the Timer Service

내가이 도움을 바랍니다.

+0

어디에서 코드를 실행해야합니까? in execute method? – AleNegrini

+0

@AleNegrini 예, 프로그래밍 방식 타이머가 만료 (해제)되면 컨테이너는 빈 구현 클래스에서 주석이 달린 메소드 @Timeout을 호출합니다. '@Timeout' 메쏘드는 timed 이벤트를 처리하는 비즈니스 로직을 포함합니다. –

+0

위에서 작성한 코드가 이미 작동합니까? 내 응용 프로그램에 붙여 넣으려고했지만 작동하지 않습니다. – AleNegrini

관련 문제