2011-12-12 37 views
6

Tôi đã cắt bên dưới mã mà tôi đang chạy hai công việc. Đầu tiên với khoảng thời gian 10 giây và người kia với khoảng thời gian là 3 giây. Nhưng cuối cùng tại một số thời điểm họ sẽ thực hiện cùng một lúc. Có cơ chế để tránh tình trạng nàyLàm thế nào để tránh hai công việc đang chạy cùng lúc với Quartz?

JobDetail jDetail = new JobDetail("Job1", "group1", MyJob.class); 
    CronTrigger crTrigger = new CronTrigger("cronTrigger", "group1", "0/10 * * * * ?"); 
    sche.scheduleJob(jDetail, crTrigger); 

    jDetail = new JobDetail("Job2","group2",MyJob2.class); 
    crTrigger = new CronTrigger("cronTrigger2","group2","0/3 * * * * ?"); 
    sche.scheduleJob(jDetail, crTrigger); 
+0

Bạn đang cố gắng đảm bảo rằng công việc sẽ không chạy hai lần trong cùng một JVM hoặc trong nhiều JVM? Ngoài ra, mỗi tác vụ mất bao lâu? Chúng có phải là giây, vài giây, vài phút không? – Bill

Trả lời

2

Bạn có thể tạo một đối tượng helper để làm cho hai công việc đồng bộ:

//In the base class 
public static Object lock = new Object(); 

//In the first class 
public void execute() { 
    synchronized(lock) { 
     //do stuff 
    } 
} 

//In the second class 
public void execute() { 
    synchronized(lock) { 
     //do stuff 
    } 
} 

Đọc thêm về đồng bộ hóa tại địa chỉ: http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

+1

nhưng OP tuyên bố rằng anh ta chạy hai lớp khác nhau, điều này sẽ không giải quyết được tình huống của anh ta –

+0

@AngeloNeuschitzer bạn hoàn toàn chính xác, không bắt được nơi có các lớp khác nhau cho công việc. –

3

Không trả lời hoàn toàn câu hỏi của bạn nhưng đây là cách bạn có thể truy vấn một thứ gì đó chạy theo cách an toàn theo chủ đề:

//sched is your org.quartz.Scheduler 
     synchronized (sched) { 
      JobDetail existingJobDetail = sched.getJobDetail(jobName, jobGroup); 
      if (existingJobDetail != null) { 
       List<JobExecutionContext> currentlyExecutingJobs = (List<JobExecutionContext>) sched.getCurrentlyExecutingJobs(); 
       for (JobExecutionContext jec : currentlyExecutingJobs) { 

        if (existingJobDetail.equals(jec.getJobDetail())) { 
         // This job is currently executing 
        } 
       } 
      } 
+0

ý tưởng hay để sử dụng Trình lập lịch biểu làm đối tượng xem! –

0

Các bạn đã thử:

org.quartz.jobStore.isClustered: true 

Ngoài ra, bạn làm cho công việc của bạn thành một công việc Stateful (và thiết lập isClustered true), và rằng shoujld giải quyết vấn đề của bạn. (Rất tiếc, StatefulJob không được dùng nữa; hãy sử dụng DisallowConcurrentExecution.)

Các vấn đề liên quan