2010-09-26 31 views

Trả lời

9

Tôi gặp vấn đề này nên tôi nghĩ tôi sẽ xem mã nguồn. Giả sử bạn đang sử dụng cấu hình chuẩn của Quartz (lưu trữ các công việc và các trigger trong RAM thay vì một JobStore liên tục), thì có vẻ như Quartz là thread an toàn.

Đào sâu vào nguồn, cuối cùng bạn sẽ đến được RamJobStore, nơi lưu trữ tất cả công việc và trình kích hoạt trong bộ nhớ.

public void storeJobAndTrigger(SchedulingContext ctxt, JobDetail newJob, 
     Trigger newTrigger) throws JobPersistenceException { 
    storeJob(ctxt, newJob, false); 
    storeTrigger(ctxt, newTrigger, false); 
} 

Trong mỗi phương pháp storeJob (..) và storeTrigger (..), có khối đồng bộ riêng biệt với các đối tượng của riêng mình để lưu trữ công việc và kích hoạt trong một sợi cách an toàn:

synchronized (jobLock) { 
     if (!repl) { 
      // get job group 
      ... 
     } 
    } 

Và đồng bộ hóa một trigger:

synchronized (triggerLock) { 
     ... 

     synchronized (pausedTriggerGroups) { 
      ... 
     } 
    } 

Vì vậy, trong ngắn hạn, có thể thấy rằng bạn có thể làm chủ đề cuộc gọi an toàn để một thể hiện của lớp Scheduler

2

This post trên trang web Terracotta xác nhận.

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