Динамические параметры для метода @Schedule в EJB 3.x

Я новичок в аннотациях @Schedule в J2EE6

Я хочу запустить работу, используя EJB 3.x со Glassfish 3.1.

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

Здесь мы хотим получить параметры из базы данных, чтобы они менялись каждый месяц. Любое чистое решение для этого?

4 ответа

Решение

Нет, нет решения с @Scheduleпотому что атрибуты аннотации в общем случае должны быть константами времени компиляции.

Когда требуется большая гибкость, можно использовать программные таймеры. Также необходимо реализовать опрос базы данных для изменения конфигурации и удаления существующих и создания новых таймеров.

@Singleton
@Запускать
открытый класс ScheduleTimerService {

    @Resource private TimerService timerService;

    public void setTimerService(TimerService timerService) {this.timerService = timerService; }

    @PostConstruct
    private void postConstruct() {
        timerService.createCalendarTimer(createSchedule());
    }

    @Timeout
    public void timerTimeout(Таймер таймера) {
           Добавьте сюда свой код, который будет вызываться при достижении расписания...
           в этом примере: 01:30 м каждый день;-)
    }

    private ScheduleExpression createSchedule(){

        Выражение ScheduleExpression = new ScheduleExpression();
        expression.dayOfWeek("Вс, Пн, Вт, Ср, Чт, Пт, Сб");    
        expression.hour("01");
        expression.minute("30");

        возвращаемое выражение;
    }
}

Ну, вам нужно создать Two Scheduler One Scheduler будет работать для обновления данных из базы данных на основе того, что вы можете создать другой планировщик.

Но для этого нужно сделать кое-какие программные. Вы также можете увидеть таймеры EJB для того же, что поможет вам в этом случае. который также основан на аннотации.

Есть простой способ сделать это. Я хотел что-то, что называлось процессом каждый день, но сама работа должна выполняться случайным образом в течение одного дня. Мне удалось это сделать, добавив простой рабочий поток для запуска после вызова службы таймера EJB. Тогда я укладывал его на случайное количество времени в течение этого дня.

Следующий код является примером службы, которая активируется каждую минуту и ​​ожидает завершения потока.

@Schedule(minute = "*/1", hour = "*", persistent = false)
public void runEveryMinute() throws InterruptedException {
    log.log(Level.INFO, "Scheduling for every minute .. now it's: " + new Date().toString());

    // Delay, in milliseconds before we interrupt adding a follower thread
    //we can therefore garantee that it runs every day
    long patience = 1000 * 5;

    threadMessage("Starting forever alone no more thread");
    long startTime = System.currentTimeMillis();
    Thread t = new Thread(new MessageLoop());
    t.start();

    threadMessage("Waiting for new thread to finish");
    // loop until MessageLoop thread exits
    while (t.isAlive()) {
        threadMessage("Still waiting...");
        // Wait maximum of 1 second for MessageLoop thread to finish.
        t.join(1000);
        if (((System.currentTimeMillis() - startTime) > patience)
                && t.isAlive()) {
            threadMessage("Tired of waiting! Adding new followers now!");
            t.interrupt();
            // Shouldn't be long now -- wait indefinitely
            t.join();
        }
    }
    threadMessage("Finally! You are not alone anymore!");

}

// Display a message, preceded by
// the name of the current thread
static void threadMessage(String message) {
    String threadName = Thread.currentThread().getName();
    System.out.format("%s: %s%n", threadName, message);
}

private static class MessageLoop implements Runnable {

    public void run() {
        String importantInfo[] = {
            "A kid will eat ivy too"
        };
        try {
            for (int i = 0;
                    i < importantInfo.length;
                    i++) {
                // Pause for 4 seconds
                int max = 10;
                int min = 2;
                int randomTimer = 0 + (int) (Math.random() * ((max - min) + 1));
                Thread.sleep(randomTimer * 1000);
                // Print a message
                threadMessage(importantInfo[i]);
            }
        } catch (InterruptedException e) {
            threadMessage("Patience is not a virtue! Thread stopping for now!");
        }
    }
}
Другие вопросы по тегам