Как запустить задание, когда другое завершается? - PullRequest
3 голосов
/ 19 марта 2012

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 19 марта 2012

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

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

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

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

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

0 голосов
/ 10 января 2014

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

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

0 голосов
/ 20 марта 2012

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

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

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