我正在开发 quartz 调度程序。 我创建了一个实现 Job 的类(com.test.job.MyClass) MyClass 包含一些在调度时传入 DataMap 的动态值。基于数据映射值,我需要通过传递此数据映射值来调用其余 API。
因此,在我的数据库中,我定义了具有 className、jobName、groupName 和 operationValue 的作业。我在数据库中定义了多个条目
就像 JOB-1 一样
jobClassName= com.test.job.MyClass
jobName=TEST1
groupName =group
operationValue =ADD
就像 JOB-2 一样
jobClassName= com.test.job.MyClass
jobName=TEST2
groupName =group
operationValue =ADD
我正在尝试安排这两个具有相同 Cron 表达式的作业。但只有 TEST1 作业正在执行。测试2不是。甚至工作名称也不同
Scheduler scheduler = scheduleFactory.getScheduler();
try {
Class<? extends Job> jobClassName = (Class<? extends Job>) Class.forName(className);
JobDetail jobDetails = JobBuilder.newJob(jobClassName).withIdentity(jobName, groupName).build();
putIntoDataMap(job, jobDetails.getJobDataMap(), user);
CronTrigger trigger = newTrigger().withIdentity(jobName, groupName)
.withSchedule(cronSchedule(cronExpression).inTimeZone("Asia/Kolkata")).build();
scheduler.scheduleJob(jobDetails, trigger);
} catch (SchedulerException | ClassNotFoundException ex) {
throw new CredityRuntimeException(CredityErrorCodes.INVALID_TRIGGER.name(), ex);
}
在实现的类中,我可以看到ADD操作,所以这意味着只运行了TEST1。我希望两者都应该运行。
public class MyClass implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException
{
.....
String operationValue=jobDataMap.get("Operation");
}
}
最佳答案
很奇怪。您可能想使用QuartzDesk (我在这里有偏见)或其他一些替代的 Quartz 管理 GUI 工具:
(1) 连接到您的 Quartz 实例并检查注册的作业和触发器。在您的情况下,您应该看到两个作业 TEST1 和 TEST2。
(2)尝试手动执行已注册的作业,看看是否可以调用您的作业。
注:免费QuartzDesk Lite Edition应该完全足够了,可以帮助您快速识别问题。
需要注意的一件事是作业持久性标志。当没有关联的触发器预计将来会触发作业时,Quartz 会自动丢弃非持久性 Quartz 作业。您没有包含 TEST1 和 TEST2 的 cron 表达式,因此您可能需要调用 storeDurably在构建您的工作详细信息时以防万一...
关于java - 无法以不同的作业名称和组运行同一类,同时运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62107346/