无法存储作业,因为已经存在具有此标识的作业
Unable to store job because one already exists with this identification
我是 Quartz 新手。
我成功安装并 运行 它。
但是当我第二次 运行 它时我有一个错误,因为这个标识的工作已经存在。
这是我的代码:
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 来更改名称,但它不起作用。
你知道我该如何解决吗?
非常感谢。
您可以:
检查 "job key" 是否已经存在,并在创建新作业之前删除现有作业:
scheduler.deleteJob(job1Key);
或使用另一个键创建一个新作业(在您的情况下,每次执行 scheduleJobs()
,变量 i
具有相同的值(0
)
或者只是重复使用相同的工作(如果旧工作还不错,为什么要创建新工作)
或使用 RAM 作业存储,它不会将作业保存在数据库中(每次您使用软件时,您都会有一个空的作业存储)
这真的取决于你想用你的工作做什么!
这不是对问题中列出的具体代码的直接回答,但我在其他地方搜索时没有注意到它,并认为这可能对未来的读者有用:
如果您处于现有 Job
但只想添加新Trigger
,您可以拨打:
scheduler.ScheduleJob(trigger);
并且它会将 Trigger
添加到 Job
而无需尝试重新创建 Job
。唯一的技巧是你必须确保 Trigger
的 JobKey
是正确的。
此交互的总体代码大致如下:
IJobDetail job; // Handed in
ITrigger trigger; // Handed in
// Keeping track of this because we need to know later whether it's new or not
var newJob = job == null;
if (newJob)
{
job = JobBuilder.Create<TargetJob>()
.WithIdentity([whatever])
[.OtherConfiguration()]
.Build();
}
var trigger = TriggerBuilder
.Create()
.WithIdentity([whatever])
// ** Gotcha #1: Make sure it's linked to the job **
.ForJob(job.Key)
[.OtherConfiguration()]
.Build();
if (newJob)
{
_scheduler.ScheduleJob(job, trigger);
}
else
{
// ** Gotcha #2: Make sure you don't reschedule the job **
_scheduler.ScheduleJob(trigger);
}
您可以通过将 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));
}
}
这是我们配置作业的方式,请注意我们正在检查作业是否已经存在,如果 await scheduler.CheckExists(dailyJob.Key)
returns 为真,我们将删除该作业信息并创建具有相同密钥的新密钥。
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();
}
您可以从this GitHub repository获得完整的源代码。
我是 Quartz 新手。 我成功安装并 运行 它。 但是当我第二次 运行 它时我有一个错误,因为这个标识的工作已经存在。
这是我的代码:
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 来更改名称,但它不起作用。 你知道我该如何解决吗? 非常感谢。
您可以:
检查 "job key" 是否已经存在,并在创建新作业之前删除现有作业:
scheduler.deleteJob(job1Key);
或使用另一个键创建一个新作业(在您的情况下,每次执行
scheduleJobs()
,变量i
具有相同的值(0
)或者只是重复使用相同的工作(如果旧工作还不错,为什么要创建新工作)
或使用 RAM 作业存储,它不会将作业保存在数据库中(每次您使用软件时,您都会有一个空的作业存储)
这真的取决于你想用你的工作做什么!
这不是对问题中列出的具体代码的直接回答,但我在其他地方搜索时没有注意到它,并认为这可能对未来的读者有用:
如果您处于现有 Job
但只想添加新Trigger
,您可以拨打:
scheduler.ScheduleJob(trigger);
并且它会将 Trigger
添加到 Job
而无需尝试重新创建 Job
。唯一的技巧是你必须确保 Trigger
的 JobKey
是正确的。
此交互的总体代码大致如下:
IJobDetail job; // Handed in
ITrigger trigger; // Handed in
// Keeping track of this because we need to know later whether it's new or not
var newJob = job == null;
if (newJob)
{
job = JobBuilder.Create<TargetJob>()
.WithIdentity([whatever])
[.OtherConfiguration()]
.Build();
}
var trigger = TriggerBuilder
.Create()
.WithIdentity([whatever])
// ** Gotcha #1: Make sure it's linked to the job **
.ForJob(job.Key)
[.OtherConfiguration()]
.Build();
if (newJob)
{
_scheduler.ScheduleJob(job, trigger);
}
else
{
// ** Gotcha #2: Make sure you don't reschedule the job **
_scheduler.ScheduleJob(trigger);
}
您可以通过将 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));
}
}
这是我们配置作业的方式,请注意我们正在检查作业是否已经存在,如果 await scheduler.CheckExists(dailyJob.Key)
returns 为真,我们将删除该作业信息并创建具有相同密钥的新密钥。
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();
}
您可以从this GitHub repository获得完整的源代码。