安排glassfish / centos工作的最佳方式

时间:2014-02-26 04:07:40

标签: java glassfish ejb

我需要运行每天运行一次的日常工作,并从不同的数据库中获取一些数据。该任务是作为EJB开发的。我用EJB尝试了@Schedule,它工作正常。但问题是如果时间表发生变化,则必须更改代码并重新部署应用程序。有办法避免这种情况吗?可以使用配置文件等。我在CentOS中使用JSF 2.2,glassfish3.4.2。

2 个答案:

答案 0 :(得分:1)

您可以通过以编程方式创建计时器来完成此操作

....
    private static final String TIMER_NAME = "SOME_TIMER_NAME";
....
    @Resource
    TimerService timerService;    
....
    public void createTimer(String days, String hours, String minutes) {
        removeTimer();
        ScheduleExpression scheduleExpression = new ScheduleExpression();       
        if (days != null) {           
            scheduleExpression.dayOfMonth(datys);
        }
        if (hours != null) {           
            scheduleExpression.hour(hours);
        }
        if (minutes != null) {           
            scheduleExpression.minute(minutes);
        }
        TimerConfig timerConfig = new TimerConfig();
        timerConfig.setInfo(TIMER_NAME);
        Timer timer = timerService.createCalendarTimer(scheduleExpression, timerConfig);
    }


    private void removeTimer() {
        for (Timer timer : timerService.getTimers()) {
            if (TIMER_NAME.equals(timer.getInfo())) {
                timer.cancel();
            }
        }
    }

    @Timeout
    public void retrieveData() {
        // retrieve data from DBs
    }

现在像这样调用createTimer方法

createTimer("*", "3", null);

retrieveData()方法将在每天凌晨3:00执行。如果要更改计划,则应使用适当的值调用方法。您可以调整它以满足您的要求,例如添加输入验证,以不同方式定义参数等。您可能需要查看ScheduleExpression以找到最适合您的方法。我的代码只显示了一个想法。

答案 1 :(得分:-1)

你考虑过使用cron工作吗? 这里有些例子: Cron examples