2013-04-12 4 views
5

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

Я хочу, чтобы запустить работу с использованием 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 
    } 
} 

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

+0

смотри также http://stackoverflow.com/questions/2598712/how-to-parameterize-scheduledfixeddelay-with-spring-3-0-expression-language не знают о GlassFish, но возможно язык выражения + свойства свойства bean – gpilotino

+0

Уважаемый @javadev, вы найдете какое-либо решение для параметрического планировщика? Если вы найдете, не могли бы вы взглянуть на мой вопрос: http://stackoverflow.com/questions/42242037/parameterize-ejb-scheduler-with-schedule-expression –

ответ

3

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

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

+0

ScheduleExpression класс не работает правильно –

0

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

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

0

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

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

@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!"); 
     } 
    } 
} 
4
 
@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; 
    } 
} 
+0

Спасибо @ Sólon Soares , У меня есть два вопроса: 1-Как настроить этот планировщик на запуск при запуске? , 2- Что эквивалентно @Schedule (second = "1", minute = "\ */5", hour = "\ *", persistent = false), отредактируйте свой код для запуска при запуске. –

+1

Привет @ H.Aqjn, 1) Запуск происходит, когда запускается jboss или другой сервер приложений. См. Аннотацию «@Startup» над объявлением класса имени. Серверное приложение создает таймер программирования «@PostContruct». Поэтому, когда таймер достигнут, он запускает метод, аннотированный «@Timeout». Поэтому, когда есть изменение таймера, он должен перезагружать пакет на сервере приложений (ухо или войну или другой формат пакета ..). Класс выражения принимает те же параметры аннотации. –

+0

Уважаемый @ Sólon Soares, пожалуйста, взгляните на мой вопрос: http://stackoverflow.com/questions/42242037/parameterize-ejb-scheduler-with-schedule-expression –

Смежные вопросы