2011-01-24 7 views
1

У меня есть приложение весны, которое использует org.springframework.scheduling.quartz.SimpleTriggerBean, чтобы запланировать выполнение метода на регулярной основе.Весна, выполнение фона или по запросу

Иногда я хочу назвать тот же метод «по требованию». Это действие будет инициировано действием GUI. Поскольку метод, который я хочу выполнить, занимает пару секунд, я не хочу блокировать пользовательский графический интерфейс до завершения выполнения. Более того, я хочу координировать выполнение «по требованию» с фоновым потоком (взаимоисключающим).

Вот один подход:

  1. Создать Bean называется менеджер, который использовать TaskExecutor запланировать задачу. Менеджер имеет метод Manager.scheduleTask()
  2. И фон и «по требованию» потоки будут называть один и тот же метод на Управляющего (Manager.scheduleTask)
  3. задача выполняется в Синхронизировать чтобы гарантировать выполнение только одной задачи .

Я ищу более умные/чистые решения.

+0

Прикреплено ли вы к кварцу, или вы считаете, что его нужно прокладывать для чего-то более простого? – skaffman

+0

Я не привязан к кварцу. Я просто использую его, потому что легко интегрироваться с Spring. У вас есть идеи без использования кварца? –

ответ

1

Вы можете использовать SingleThreadExecutor.

ExecutorService exec = Executors.newSingleThreadExecutor(); 
exec.submit(<task>); 

При срабатывании кварцевой работы он может отправить задание исполнителю. Аналогично, когда ваша работа выполняется вручную, она также может отправить задание исполнителю. Поскольку ExecutorService имеет только один поток, задача может выполняться только один раз за раз. Другой экземпляр задачи будет помещен в очередь до тех пор, пока не завершится работающий в данный момент. В этом случае вам не нужно беспокоиться о ручной синхронизации.

+0

это решит синхронизацию. Тем не менее, это почти то же самое решение, которое я предложил. Мне интересно, есть ли другие - возможно лучше - подходит –

3

Если вы используете Spring 3.0, посмотрите раздел Task Execution and Scheduling справочного документа.

Это показывает, что есть два аннотаций:

  • @Scheduled
  • @Timer

soultion будет такой же, как минимум: имеющие 3 метода:

private void doIt() {...} 

@Scheduled(cron="0 0 0 * * MON-FRI") 
public void doItEveryDay() {doIt();} 

@Async 
public void doItOnDemand() {doIt();} 

Но с этими аннотациями легко было бы легко прочитать o Недостаточно, почему существует три метода.

+0

Tks для предложения. Хотя это все же одно и то же решение, я согласен, что его легче читать с аннотациями. –

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