0

我正在研究石英调度程序。我创建了一个实现 Job MyClass 的类(com.test.job.MyClass),其中包含一些在调度时传入 DataMap 的动态值。基于数据映射值,我需要通过传递此数据映射值来调用其余 API。

所以在我的数据库中,我定义了具有 className、jobName、groupName 和 operationValue 的作业。我在 DB 中定义了多个条目

就像 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 作业正在执行。Test2 不是。甚至jobName都不一样

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");
    }
}
4

1 回答 1

0

很奇怪。您可能想要使用QuartzDesk(我在这里有偏见)或其他一些可选的 Quartz 管理 GUI 工具来:

(1) 连接到您的 Quartz 实例并检查已注册的作业和触发器。在您的情况下,您应该看到两个作业 TEST1 和 TEST2。

(2)尝试手动执行注册的jobs,看看你的jobs能不能被调用。

注意:免费的QuartzDesk Lite Edition应该完全足够,可以帮助您快速识别问题。

要注意的一件事是作业耐久性标志。当没有预期在未来触发该作业的关联触发器时,Quartz 会自动丢弃非持久性 Quartz 作业。您没有包含 TEST1 和 TEST2 的 cron 表达式,因此您可能希望在构建工作详细信息时调用storeDurably以防万一......

于 2020-06-02T16:34:55.370 回答