我正在尝试完成触发石英作业并以某种方式将该作业绑定到特定用户或会话,并能够检查作业的状态。
基本上我需要在每次用户登录时触发一个作业。这个作业下载特定于该用户的信息 - 可能需要几分钟,并且许多这些作业可能会因多个用户登录而异步触发同一时间。
现在的问题是,当作业运行时,用户可能正在访问网站上的不同页面 - 也就是说,我不想打断它们,所以我需要一种方法来触发作业,但首先检查是否已经为该特定用户运行了一个。我还需要能够在作业完成后更新UI。
我在这里有点不知所措..我在谷歌上找不到多少所以我真的很感激任何见解。
答案 0 :(得分:0)
我只能提出一个建议。我不确定为什么每次用户登录时都会询问如何触发作业。为此,您需要做的就是将作业中的所有代码放入服务中,以便在登录控制器中也可以在用户登录时调用服务代码。
在工作班:
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()
}
至于跟踪作业是否正在运行,有几种方法可以执行此操作,例如保留特定于用户的标志,并在运行作业之前检查标志。
答案 1 :(得分:0)
查看Executor Plugin。它会向您的Grails工件添加callAsync()
MetaMethod,它将返回一个Java Future
对象,以便您可以检索异步调用的状态和结果。
如果您还需要Quartz的调度功能,只需将您的逻辑放在Grails服务中,并根据具体情况从Quartz作业或callAsync()
调用Service方法。