Java 无法存储作业,因为已存在具有此标识的作业
我是石英的新手。 我成功地安装并运行了它。 但是,当我第二次运行它时,我有一个错误,因为该作业已经存在,并且具有此标识 这是我的代码:Java 无法存储作业,因为已存在具有此标识的作业,java,quartz-scheduler,Java,Quartz Scheduler,我是石英的新手。 我成功地安装并运行了它。 但是,当我第二次运行它时,我有一个错误,因为该作业已经存在,并且具有此标识 这是我的代码: public void scheduleJobs() throws Exception { try { int i = 0; scheduler = new StdSchedulerFactory().getScheduler(); JobKey job1Key = JobKey.jobKey("jo
public void scheduleJobs() throws Exception {
try {
int i = 0;
scheduler = new StdSchedulerFactory().getScheduler();
JobKey job1Key = JobKey.jobKey("job"+i, "my-jobs"+i);
JobDetail job1 = JobBuilder
.newJob(SimpleJob.class)
.withIdentity(job1Key)
.build();
TriggerKey tk1 = TriggerKey.triggerKey("trigger"+i, "my-jobs"+i);
Trigger trigger1 = TriggerBuilder
.newTrigger()
.withIdentity(tk1)
.withSchedule(CronScheduleBuilder.dailyAtHourAndMinute(11, 25))
.build();
scheduler.start(); // start before scheduling jobs
scheduler.scheduleJob(job1, trigger1);
i++;
printJobsAndTriggers(scheduler);
} catch (SchedulerException e) {
LOG.error("Error while creating scheduler", e);
}
}
我尝试使用整数I来更改名称,但无效。
你知道我怎么修吗?
非常感谢。您可以:
- 检查“作业密钥”是否已存在,并在创建新作业之前删除现有作业:
scheduler.deleteJob(job1Key)代码>
- 或者使用另一个键创建新作业(在您的情况下,每次执行
,变量scheduleJobs()
都具有相同的值(i
)0
- 或者只是重复使用同一份工作(如果旧工作还不错,为什么还要创建新工作)
- 或者使用RAM作业存储,它不会将作业持久保存在数据库中(每次使用软件时,都会有一个空的作业存储)
作业
,但只想添加一个新的触发器
,您可以调用:
scheduler.ScheduleJob(触发器);
它会将触发器添加到作业
,而无需重新创建作业
。唯一的技巧是必须确保触发器的作业键
正确
我的整个交互代码大致如下所示:
IJobDetail作业;//已提交
ITrigger触发器;//已提交
//保持跟踪,因为我们需要稍后知道它是否是新的
var newJob=job==null;
如果(新工作)
{
job=JobBuilder.Create()
.WithIdentity([任何])
[.OtherConfiguration()]
.Build();
}
var trigger=TriggerBuilder
.Create()
.WithIdentity([任何])
//**明白了#1:确保它与工作相关**
.ForJob(job.Key)
[.OtherConfiguration()]
.Build();
如果(新工作)
{
_ScheduleJob(作业,触发器);
}
其他的
{
//**明白了#2:确保不要重新安排工作**
_ScheduleJob(触发器);
}
您可以通过将i作为静态int来创建新作业。它不是“job”+i,而是“job”+Integer.toString(i)。它对我有效。在计划之前检查现有作业:
JobDetail job;
SimpleTrigger trigger;
//Create your trigger and job
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
if (scheduler.checkExists(job.getKey())){
scheduler.deleteJob(job.getKey());
}
scheduler.scheduleJob(job, trigger);
如果你们中的任何人面临相同的问题,并且您的解决方案是C#。这就是您可以修复此错误的方法
这是我们配置调度程序的地方
public async Task StartAsync(CancellationToken cancellationToken) {
try {
var scheduler = await GetScheduler();
var serviceProvider = GetConfiguredServiceProvider();
scheduler.JobFactory = new CustomJobFactory(serviceProvider);
await scheduler.Start();
await ConfigureDailyJob(scheduler);
}
catch(Exception ex) {
_logger.Error(new CustomConfigurationException(ex.Message));
}
}
这就是我们如何配置作业的方法,请注意,我们正在检查作业是否已经存在,如果wait scheduler.CheckExists(dailyJob.Key)
返回true,我们将删除该作业信息并使用相同的密钥创建一个新的作业
private async Task ConfigureDailyJob(IScheduler scheduler) {
var dailyJob = GetDailyJob();
if (await scheduler.CheckExists(dailyJob.Key)) {
await scheduler.DeleteJob(dailyJob.Key);
_logger.Info($ "The job key {dailyJob.Key} was already existed, thus deleted the same");
}
await scheduler.ScheduleJob(dailyJob, GetDailyJobTrigger());
}
还有一些支持私人功能
private IJobDetail GetDailyJob() {
return JobBuilder.Create < IDailyJob > ().WithIdentity("dailyjob", "dailygroup").Build();
}
private ITrigger GetDailyJobTrigger() {
return TriggerBuilder.Create().WithIdentity("dailytrigger", "dailygroup").StartNow().WithSimpleSchedule(x = >x.WithIntervalInHours(24).RepeatForever()).Build();
}
private IJobDetail GetDailyJob(){
返回JobBuilder.Create(),使用标识(“dailyjob”、“dailygroup”).Build();
}
私有ITrigger GetDailyJobTrigger(){
返回TriggerBuilder.Create().WithIdentity(“dailytrigger”、“dailygroup”).StartNow().WithSimpleSchedule(x=>x.WithIntervalInHours(24.RepeatForever()).Build();
}
您可以从中获得完整的源代码。谢谢您的回答。实际上,我不想将每个作业存储在我的数据库中。我在群集模式下使用quartz,每天00:00在tomcat上运行一个函数。因此,如果作业已经存在,我可以选择删除该作业,或者使用RAM作业存储,对吗?@Majestic,如果您在群集中ng模式,您不能使用RAM作业存储。请参阅非常感谢-我使用的是jdbcjobstore。