Динамические параметры для метода @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!");
}
}
}