2013-03-06 45 views
19

Tôi có một yêu cầu để chạy công việc hàng loạt tại một khoảng thời gian cố định và có khả năng thay đổi thời gian của công việc hàng loạt này khi chạy. Đối với điều này tôi đã xem qua chú thích @ Scheduled được cung cấp trong khung Spring. Nhưng tôi không chắc chắn làm thế nào tôi sẽ thay đổi giá trị của fixedDelay khi chạy. Tôi đã làm một số googling xung quanh nhưng không tìm thấy bất cứ điều gì hữu ích.Cách thay đổi Spring's @Scheduled fixedDelay tại thời gian chạy

+0

Tôi thấy bạn đã chấp nhận câu trả lời hay nhất, nhưng tôi vẫn thấy có một số vấn đề chưa được giải quyết. Vấn đề NPE có được giải quyết không? Bạn có thể đăng toàn bộ giải pháp cho điều này không?Chúc mừng – despot

+0

Có thể trùng lặp [Lập lịch công việc với Spring theo lập trình (với fixedRate được đặt động)] (http://stackoverflow.com/questions/14630539/scheduling-a-job-with-spring-programmatically-with-fixedrate-set- động) –

Trả lời

17

Bạn có thể sử dụng Trigger để tự động đặt thời gian thực hiện tiếp theo. Xem câu trả lời của tôi ở đây:

Scheduling a job with Spring programmatically (with fixedRate set dynamically)

+0

Chính xác những gì tôi đang tìm kiếm - Cảm ơn bạn đời – jsf

+0

FYI - Đã để lại cho bạn nhận xét về lỗi 'NullPointerException' được chú ý trong mã. – jsf

+0

Có cách nào để làm gián đoạn Trình kích hoạt hiện tại và thay đổi giá trị của nó khi đang ngủ. – jsf

2

AFAIK API Spring sẽ không cho phép bạn truy cập vào nội bộ bạn cần thay đổi trình kích hoạt. Nhưng bạn thay vì có thể cấu hình bằng tay đậu:

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> 
    <property name="jobDetail" ref="jobDetail" /> 
    <property name="startDelay" value="10000" /> 
    <property name="repeatInterval" value="50000" /> 
</bean> 

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    <property name="triggers"> 
     <list> 
      <ref bean="simpleTrigger" /> 
     </list> 
    </property> 
</bean> 

Sau đó, như tài liệu trong SchedulerFactoryBean:

Đối với đăng ký năng động của công việc trong thời gian chạy, sử dụng một tham chiếu đậu để SchedulerFactoryBean này để có được quyền truy cập trực tiếp đến Quartz Scheduler (org.quartz.Scheduler). Điều này cho phép bạn tạo các công việc và kích hoạt mới và cũng có thể kiểm soát và giám sát toàn bộ Công cụ lập lịch biểu .

33

Trong khởi động mùa xuân, bạn có thể sử dụng một tài sản ứng dụng trực tiếp!

Ví dụ:

@Scheduled(fixedDelayString = "${my.property.fixed.delay.seconds}000") 
private void process() { 
    // your impl here 
} 

Lưu ý rằng bạn cũng có thể có một giá trị mặc định trong trường hợp tài sản không được định nghĩa, ví dụ như để có một mặc định của "60" (giây):

@Scheduled(fixedDelayString = "${my.property.fixed.delay.seconds:60}000") 

những điều khác tôi phát hiện ra:

  • phương pháp phải được bãi bỏ
  • phương pháp này phải không có thông số
  • phương pháp này có thể private

tôi thấy việc có thể sử dụng private tầm nhìn tiện dụng và sử dụng nó theo cách này:

@Service 
public class MyService { 
    public void process() { 
     // do something 
    } 

    @Scheduled(fixedDelayString = "${my.poll.fixed.delay.seconds}000") 
    private void autoProcess() { 
     process(); 
    } 
} 

Being private, phương thức được lên lịch có thể là cục bộ cho dịch vụ của bạn và không trở thành một phần của API dịch vụ của bạn.

Ngoài ra, phương pháp này cho phép phương pháp process() trả lại giá trị, phương pháp @Scheduled có thể không. Ví dụ, phương pháp process() của bạn có thể trông giống như:

public ProcessResult process() { 
    // do something and collect information about what was done 
    return processResult; 
} 

để cung cấp một số thông tin về những gì đã xảy ra trong khi xử lý.

+0

Cảm ơn, 'fixedDelayString' là những gì tôi đang tìm kiếm – prettyvoid

+0

Câu trả lời hay. Làm việc như mô tả. – flash

+1

@Bohemain Cảm ơn bạn đã giải pháp, nhưng bản cập nhật fixedDelay được cập nhật như thế nào trong thời gian chạy? –

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