EJB 3.x中@Schedule方法的动态参数

jav*_*dev 6 java schedule timer ejb-3.0

我是J2EE6中@Schedule注释的新手

我想使用带有Glassfish 3.1的EJB 3.x运行一个作业.

javax.ejb.Schedule对我们来说似乎是个不错的选择,所以我们可以把我们的自定义时间想象成:

@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
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,我们希望从数据库中获取参数,因此它们每个月都会更改.对此有什么清洁解决方案?

小智 5

@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;
    }
}


Mik*_*unu 4

不,没有解决方案@Schedule,因为注释属性通常应该是编译时常量。

当需要更大的灵活性时,可以使用编程定时器。此外,还必须实施轮询数据库以了解更改的配置以及删除现有计时器和创建新计时器。