I'm new to the @Schedule annotations in J2EE6
I want to run a job using EJB 3.x with Glassfish 3.1.
The javax.ejb.Schedule seems to be a good choice for us, so we could think of our custom time as something like:
@Singleton
public class CustomTimer {
@EJB
SettingsFacade settingsFacade;
@Schedule(second="someSecondParameter", minute="someMinuteParameter",hour="someHourParameter", persistent=false)
public void executeTimer(){
//Code executing something against database using the settingsFacade
}
}
Here, we want the parameters to be got from database, so they are changed every month. Any clean solution for this?
@Singleton @Startup public class ScheduleTimerService { @Resource private TimerService timerService; public void setTimerService(TimerService timerService) {this.timerService = timerService; } @PostConstruct private void postConstruct() { timerService.createCalendarTimer(createSchedule()); } @Timeout public void timerTimeout(Timer timer) { Add your code here to be called when scheduling is reached... in this example: 01h:30m every day ;-) } private ScheduleExpression createSchedule(){ ScheduleExpression expression = new ScheduleExpression(); expression.dayOfWeek("Sun,Mon,Tue,Wed,Thu,Fri,Sat"); expression.hour("01"); expression.minute("30"); return expression; } }
No, there is no solution with @Schedule
, because annotation attributes in general should be compile time constants.
When more flexibility is needed, programmatic timers can be used. Also then polling database for changed configuration and removing existing and creating new timers must be implemented.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With