我有模板列表,每个模板都有不同的参数集, 并且每个模板必须在特定时间执行。我如何处理 Quartz调度程序中的这个问题
Template Parameters list Time of execution
T1 ['date','frequency'] 3:30 AM
T2 ['Id'] 10:20 AM
T3 ['customerid','houseNo','Info'] 6:06 PM
和execute()方法将对参数列表执行一些操作 每个模板。我想在单个Quartz作业中执行此操作。我在努力 像这样的东西:
def list = ["*/2 * * * * ?","*/10 * * * * ?","*/20 * * * * ?"]
String triggerName;
int j=0;
for(cronExpr in list)
{
j++;
triggerName="trigger"+Integer.toString(j)
triggerName = new CronTrigger();
triggerName.setName(triggerName);
triggerName.setGroup(job.getGroup());
triggerName.setJobName(job.getName());
triggerName.setJobGroup(job.getGroup());
triggerName.setCronExpression(cronExpr);
}
我之前没有得到任何满意的答案就问了类似的问题 如果有人能提供更好的方法,那将会非常有帮助 解决这个问题以及石英上的一些指南或有用的链接 调度可以指导我完成基本和高级主题 我对如何使用多个触发器或某些触发器有了更好的理解 解决上述问题的方法。
答案 0 :(得分:0)
在您的情况下,我可能会做的是,我会为单个作业创建多个触发器,以实现所有模板共有的所需业务逻辑。
每个触发器都会在其JobDataMap中指定可与触发器关联的模板参数。触发作业并调用其execute方法后,您可以使用以下代码访问相关的模板参数:
context.getMergedJobDataMap()
有关详细信息,请参阅getMergedJobDataMap JavaDoc。
Java中的示例:
public class TemplateJob implements Job {
public void execute(JobExecutionContext context)
throws JobExecutionException
{
JobDataMap dataMap = context.getMergedJobDataMap();
String templateId = dataMap.getString("templateId");
if ("T1".equals(templateId))
{
// template1 params
String t1Date = dataMap.getString("date");
String t1Frequency = dataMap.getString("frequency");
doTemplate1Logic(t1Date, t1Frequency);
}
else if ("T2".equals(templateId))
{
// template2 params
String t2Id = dataMap.get("Id");
doTemplate2Logic(t1Id);
}
else if ("T3".equals(templateId))
{
// template3 params
String t3CustomerId = dataMap.get("customerid");
String t3HouseNo = dataMap.get("houseNo");
String t3Info = dataMap.get("Info");
doTemplate3Logic(t1Id);
}
else
{
throw new JobExecutionException("Unrecognized template ID: " + templateId);
}
}
...
}
public class TestCase
{
public static void main(String[] args)
{
Scheduler scheduler = ....
JobDetail templateJob = JobBuilder.newJob(TemplateJob.class)
.withIdentity("templateJob", "myJobGroup")
.build();
// trigger for Temlate1
Trigger template1Trigger = TriggerBuilder.newTrigger()
.withIdentity("template1Trigger", "myTriggerGroup")
.withSchedule(TriggerBuilder.cronSchedule("*/2 * * * * ?"))
.usingJobData("date", "...")
.usingJobData("frequency", "...")
.forJob("templateJob", "myJobGroup")
.build();
scheduler.scheduleJob(templateJob, template1Trigger);
// trigger for Temlate2
Trigger template2Trigger = TriggerBuilder.newTrigger()
...
scheduler.scheduleJob(templateJob, template2Trigger);
...
}
}
如果模板处理逻辑对于单个模板有很大不同,您可能应该为每个模板实现单独的作业。