web-dev-qa-db-ja.com

このIDを持つジョブがすでに存在するため、ジョブを保存できません

私はクォーツで新しいです。インストールと実行に成功しました。しかし、2回目に実行するとエラーが発生します。このIDを持つジョブがすでに存在しているためです。

ここに私のコード:

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を使用して名前を変更しようとしましたが、機能しません。どうすれば修正できますか?どうもありがとう。

12
Majestic

あなたはできる:

  • 「ジョブキー」がすでに存在するかどうかを確認し、新しいジョブを作成する前に既存のジョブを削除します。

    scheduler.deleteJob(job1Key);

  • または、別のキーで新しいジョブを作成します(あなたの場合、scheduleJobs()を実行するたびに、変数iは同じ値(0

  • または同じジョブを再利用する(古いジョブがまだ良いのになぜ新しいジョブを作成するのか)

  • または、RAMジョブストアを使用します。これは、データベースにジョブを永続化しません(ソフトウェアを使用するたびに、空のジョブストアが作成されます)

それは本当にあなたがあなたの仕事で何をしたいかによります!

15
olivierlemasle

これは質問に記載されている特定のコードに対する直接の回答ではありませんが、他の場所を検索しているときに気付かなかったため、将来の読者にとって役立つ可能性があると考えました。

既存JobがあるがnewTriggerを追加したい場合は、次のように呼び出すことができます。

scheduler.ScheduleJob(trigger);

Triggerを再作成せずにJobJobに追加します。唯一のトリックは、TriggerJobKeyが正しいことを確認する必要があることです。

この相互作用の私の全体的なコードは、おおよそ次のようになります。

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);
}
6
eouw0o83hf

スケジュールする前に既存のジョブを確認します。

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);
4
Oleg Mikhailov

あなたの誰かが同じ問題に直面していて、あなたの解決策が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)が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();
}
_

このGitHubリポジトリ から完全なソースコードを取得できます。

0
Sibeesh Venu