2013-12-17 2 views
0

У меня есть EJB со следующим запланированным методом:Добавить дополнительный триггер @Schedule

@Schedule(hour = "*", minute = "*", second = "*/5", persistent = false) 
public void runWorkerManager() { 
    final boolean jobProcessed = this.workerManager.execute(); 
    if (jobProcessed) { 
     this.runWorkerManager(); 
    } 
} 

Идея заключается в том, что часто является вторым (и третьим и так далее) заданием на обработку после того, как один обрабатываются, поэтому я хотел бы снова запустить метод execute(), как показано выше.

Проблема в том, что делать это таким образом очень плохо, так как я не выпускаю нить EJB. Вместо этого я хотел бы добавить дополнительный триггер в @Schedule, который будет запускать весь runWorkerManager() снова как можно скорее. Однако я не нашел способа сделать это.
Возможно ли это? Если это не так, есть ли другой способ получить подобное поведение?

+0

Вы решили создать новый поток [managed] (https://concurrency-ee-spec.java.net/javadoc/javax/enterprise/concurrent/ManagedExecutorService.html)? –

ответ

0

То, что я в конечном итоге делает сначала получить ссылку на TimerService, как это:

@Resource 
TimerService timerService; 

Тогда я просто добавил @Timeout аннотацию к моему методу, и использовали метод TimerService#createTimer(), чтобы добавить новый триггер:

@Schedule(hour = "*", minute = "*", second = "*/5", persistent = false) 
@Timeout 
public void runWorkerManager() { 
    final boolean jobProcessed = this.workerManager.execute(); 
    if (jobProcessed) { 
     timerService.createTimer(10L, "Check for more jobs..."); 
    } 
} 
0

Мне этот случай использования требует MessageDrivenBean.

В вашем случае я бы сделал WorkerManagerMessageDrivenBean слушать на некоторых JMS queue, к которому jobs посылаются. Таким образом, вы гарантируете, что всякий раз, когда работа придет, она будет обработана как можно скорее.

+0

Это похоже на полный пересмотр структуры программы, чего я не хочу делать. – Keppil

+0

Вы уже используете EJB, поэтому я предположил, что это будет большой проблемой. Во всяком случае, я не знаю, каким образом вы можете достичь чего-то подобного, используя только фасоль без состояния. Может быть, вы можете попробовать инверсию управления и позволить своему хранилищу заданий уведомить workManagers о том, что некоторые рабочие задания готовы к выполнению? – Blekit

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