2012-03-19 2 views
3

У меня есть два задания, считайте их суперпростыми заданиями, которые просто печатают строку и не имеют триггеров или тайм-аутов. Они отлично работают, когда я вызываю их из класса контроллера через: <name of my class>Job.triggerNow()Как я могу запустить задание, когда другой заканчивается?

Я хочу, чтобы запускать одно задание и, как оно завершается, запускать последующее другое задание.

Я пробовал использовать quartzScheduler, но я не могу получить JobDetail из моих классов работы, поэтому я не уверен, что это правильный способ сделать это. Я также хочу передать некоторые результаты из первой работы на вторую.

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

Любая помощь будет принята с благодарностью. спасибо

+0

Извините, забыл упомянуть, что это использует кварц в граале (так что я использую groovy, а не java) –

ответ

2

Похоже, что вы после этого - это асинхронный «конвейер» работы, где есть разные работники, которые все находятся в одной строке и передают данные, которые будут обрабатываться от одного к другому. Этот вид архитектуры удивительно гибкий и относится к большой ряд очень распространенных приложений

Лучший способ, который я нашел, чтобы получить такую ​​архитектуру в месте с Grails является использование очереди сообщений, как RabbitMQ например, с чередой очередей (по одному для каждого шага в конвейере), а затем контроллер (ы) помещает сообщения на первый этап конвейера.

Затем у вас есть работник (только сервис в приложении Grails, если вы используете отличный RabbitMQ Grails plugin), слушайте очередь, в которой есть рабочие места для их работы. По мере ввода работы в очередь рабочий выкидывает задание, обрабатывает его и затем помещает сообщение в очередь следующего шага в конвейере.

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

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

+0

спасибо за предложения. Поэтому, чтобы уточнить, могу ли я по-прежнему использовать кварцевые задания в фоновом режиме и подключать их через RabbitMQ через службы или контроллеры, или мне нужно переместить мои «рабочие места» в обычные классы java/groovy или в сервисы и оттуда? –

+0

Для любой задачи, которая должна произойти в расписании_, мы выполняем кварцевые задания. Для любых задач, которые должны походить на то, чтобы рабочий смотрел очередь заданий и обрабатывал их по мере их поступления, используйте плагин RabbitMQ для создания слушателя (который является только службой grails) в очереди, которая выполняет эту работу. Разница заключается в том, что кварцевые задания являются периодическими, а задания RabbitMQ обрабатывают задания так быстро, как только могут. – cdeszaq

0

Пожалуйста, посмотрите @ JobListener

You могут использовать

public void jobWasExecuted(JobExecutionContext context, 
      JobExecutionException jobException); 
0

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

Каждое задание должно сообщать о статусе выполнения/завершения/отмены с использованием очереди Redis. Мастер-задание выдает каждое сообщение очереди и обрабатывает его правильно.