2014-11-04 79 views
1

我想要做的是從我的作業中刪除觸發器併爲其指定一個全新的觸發器。我限制了我的用戶只能爲每個作業添加一個觸發器。但我想讓他們選擇刪除該觸發器並添加新的觸發器到同一個作業。無法存儲持久作業,因爲它'已經存在'

爲了不失去我的工作信息,我將我的工作添加爲durable

然後我發現,與該作業相關的觸發和使用

sched.UnscheduleJob(trigger.Key); 

刪除觸發器(這也應該取消調度作業太多,除非它是durable這是我的情況)。

現在我知道觸發器已被刪除,但我的工作仍在那裏。 當我嘗試我的新的觸發器添加到使用此作業

sched.ScheduleJob(job, newTrigger); 

我得到的錯誤:

Couldn't store job: Unable to store Job: 'MYGROUP.MYJOB', because one already exists with this identification.

這是我所知道的,但我還是想在新的觸發關聯到這個工作。

爲什麼會發生這種情況?我怎樣才能將新的觸發器添加到舊的工作中,而不必刪除舊的工作?

回答

3

這是一個相當常見的錯誤;正如您可能知道的那樣,致電sched.ScheduleJob(job, newTrigger)嘗試將JobDetail重新插入到QRTZ_JOB_DETAILS表中。這會導致違反約束,因爲表的主鍵是調度程序名稱JobKeyJobGroup的組合。 Quartz在內部巧妙地處理這個問題,並給你一個有意義的錯誤,而不是僅僅報告主鍵違規。

解決方案實際上很簡單,只需用新觸發器替換舊觸發器即可。

ITrigger newTrigger = TriggerBuilder.Create() 
         .WithCronSchedule(newExpression) 
         .WithIdentity(newTriggerKey) 
         .StartNow() 
         .Build(); 

    sched.RescheduleJob(existingTrigger.Key, newTrigger); 
相關問題