2011-06-06 28 views
11

tôi muốn tự động thêm trigger để một công việc, nhưng không thể tìm thấy bất kỳ phương pháp hữu ích tắt của SchedulerThêm nhiều trigger để công việc thạch anh đơn

tôi mặc dù tôi sẽ chỉ có thể gọi phương thức scheduleJob một lặp đi lặp lại, nhưng điều này mang lại cho tôi ngoại lệ ObjectAlreadyExists "vì đã tồn tại với nhận dạng này".

Tôi làm cách nào để thực hiện việc này?

EDIT

private boolean scheduleLoadJob(XfuScheduleTimeInfo time) 
{ 
    LoadScheduleJob job = new LoadScheduleJob(time); 
    JobDetail detail; 

    Integer id = Integer.valueOf(time.getScheduleId()); 
    if(_hashMap.containsKey(id)) 
    { 
     detail = _hashMap.get(Integer.valueOf(time.getScheduleId())); 
    } 
    else 
    { 
     detail = job.getDetail(); 
     _hashMap.put(id, detail); 
    } 

    try 
    { 
     Trigger newTrigger = job.getTrigger(); 
     _log.debug("------" + newTrigger.getKey()); 
     _quartzScheduler.scheduleJob(detail, newTrigger); 
     return true; 
    } 
    catch(ParseException e) 
    { 
     _log.error("Unable to parse cron expression for " + job.getInfo()); 
     return false; 
    } 
    catch(SchedulerException e) 
    { 
     _log.error("Job scheduling failed for " + job.getInfo()); 
     return false; 
    } 
} 

với Console Output

------ LoadJobs.Trigger-44

mua lại hàng loạt trong tổng số 1 gây nên

Sản xuất thể hiện của Công việc 'LoadJobs.Job-42', class = com.scheduling.LoadScheduleJob

Gọi thực thi trên công việc LoadJobs.Job-42

mua lại hàng loạt trong tổng số 1 gây nên

việc kêu gọi: 42: 44

------ LoadJobs.Trigger-45

Lập lịch công việc không thành công trong 42: 45 - 1/5 * *? * *

Trả lời

8

This post đưa ra một gợi ý, nhưng kết luận (schedulerInstance.add (trigger)) là không hợp lệ như của thạch anh 2.01.

Thay vì sử dụng những điều sau đây, sau khi Cử công việc để kích hoạt (một chiều được sử dụng phương pháp forJob của TriggerBuilder)

schedulerInstance.scheduleJob(newTrigger) 
+0

Xin chào Jake.I có một danh sách các biểu thức cron như def list = ["0 0/10 * * *?", "0 0/20 * * *?", "0 0/30 * * *?"] Và tôi muốn tạo ra các trigger trong một vòng lặp như String triggerName; \t int j = 0; \t cho (cronExpr trong danh sách) \t { \t j ++; \t \t \t triggerName = "trigger" + Integer.toString (j) \t \t \t triggerName = new CronTrigger(); \t \t \t triggerName.setName (triggerName); \t \t \t triggerName.setGroup (job.getGroup()); \t \t \t triggerName.setJobName (job.getName()); \t \t \t triggerName.setCronExpression (cronExpr); } và gọi phương thức execute() trong thạch anh cho thời gian khác nhau với các tham số khác nhau. Làm thế nào để tôi tiếp cận điều này? – elyon

1

Bạn có thể gọi scheduleJob liên tục. Chỉ cần đảm bảo rằng bạn cung cấp cho mỗi Trình kích hoạt một tên/nhóm duy nhất.

Xem TriggerBuilder.withIdentity: http://www.quartz-scheduler.org/docs/api/2.0.0/index.html

+0

Các trigger có tên gọi khác nhau. Tôi đã bỏ lỡ một phần lỗi, nó nói - Không thể lưu trữ Job: 'LoadJobs.Job-42', vì đã tồn tại với nhận dạng này, vì vậy có vẻ như vấn đề là với công việc – rediVider

+0

Không thể lưu trữ Job: 'LoadJobs. Job-42 ', bởi vì một cái đã tồn tại với nhận dạng này. – rediVider

4
CronTrigger trigger=null; 
    CronTrigger trigger1=null; 
    CronTrigger trigger2=null; 

    JobDetail job = new JobDetail(); 
    job.setName("dummyJobName"); 
    job.setJobClass(ExampleJob.class); 

    trigger = new CronTrigger(); 
    trigger.setName("AppTrigger"); 
    trigger.setGroup(job.getGroup()); 
    trigger.setJobName(job.getName()); 
    trigger.setJobGroup(job.getGroup()); 
    trigger.setCronExpression("*/2 * * * * ?"); 

    trigger1 = new CronTrigger(); 
    trigger1.setName("AppTrigger1"); 
    trigger1.setGroup(job.getGroup()); 
    trigger1.setJobName(job.getName()); 
    trigger1.setJobGroup(job.getGroup()); 
    trigger1.setCronExpression("*/2 * * * * ?"); 

    trigger2 = new CronTrigger(); 
    trigger2.setName("AppTrigger2"); 
    trigger2.setGroup(job.getGroup()); 
    trigger2.setJobName(job.getName()); 
    trigger2.setJobGroup(job.getGroup()); 
    trigger2.setCronExpression("*/2 * * * * ?"); 

    Scheduler scheduler = new StdSchedulerFactory().getScheduler(); 

    scheduler.start(); 
    scheduler.addJob(job, true); 
    scheduler.scheduleJob(trigger); 
    scheduler.scheduleJob(trigger1); 
    scheduler.scheduleJob(trigger2); 
Các vấn đề liên quan