Как получить состояние фоновой операции (Кварцевая работа?) В Grails - PullRequest
0 голосов
/ 16 февраля 2012

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 16 февраля 2012

Проверьте плагин Executor .Он добавляет callAsync() MetaMethod к вашим артефактам Grails, который будет возвращать объект Java Future, чтобы вы могли получить статус и результаты вашего асинхронного вызова.

Если вам нужна также возможность планирования Quartzпросто поместите свою логику в службу Grails и вызовите метод Service из задания Quartz или через callAsync() в зависимости от обстоятельств.

0 голосов
/ 16 февраля 2012

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

В рабочем классе:

class EmailAlertJob {

    def utilService
    static triggers = {
       cron name: 'emailCronTrigger', cronExpression: "0 15 1 ? * SUN-SAT"
    }
    def execute() {
       def send= utilService.sendEmail()
    }
}

В контроллере:

def userLogsIn = {
    utilService.sendEmail()
}

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

...