2011-08-18 39 views
7

Có cách nào để bắt đầu hoặc dừng tác vụ được lên lịch sử dụng Tác vụ theo lịch trình được khởi tạo bằng cách sử dụng tệp ngữ cảnh hoặc chú thích @Scheduled?Spring ScheduledTask - hỗ trợ bắt đầu/dừng?

Tôi muốn bắt đầu tác vụ khi được yêu cầu và dừng khi tác vụ không còn cần thiết để chạy.

Nếu điều này là không thể, bất kỳ thay thế nào để tiêm biến mùa xuân vào chuỗi?

Trả lời

1

Phương pháp @Scheduled tìm biến số được tổ chức ở trạng thái Application hoặc ServletContext hoặc từ giá trị được lưu trữ trong DB. Nếu giá trị là TRUE, hãy tiếp tục với nhiệm vụ; nếu FALSE, đừng bắt đầu. Thiết lập này sẽ kiểm soát chạy theo lịch trình.

Nếu bạn muốn cũng có thể kích hoạt tác vụ theo ý muốn, hãy tham khảo phương thức của nhiệm vụ từ Bộ điều khiển; theo cách đó bạn có thể bắn theo ý muốn. Ngoài ra, nếu một nhiệm vụ chạy dài hơn của nó, hãy tạo phương thức thứ hai có chú thích @Async và gọi phương thức đó từ Bộ điều khiển của bạn để nó chạy theo chuỗi riêng của nó.

+0

Khi bạn nói "không bắt đầu", điều này không thể thực hiện được, Spring sẽ chạy hàm đó sau mỗi X giây. Không có cơ chế "khởi động". – mbdev

+0

Tôi có nghĩa là thoát khỏi phương pháp, hoặc làm một cái gì đó khác để chức năng kinh doanh của phương thức không được thực thi. – atrain

+0

Vâng, tôi nghĩ rằng phương pháp sẽ tiếp tục thực hiện chức năng mặc dù nó thoát. Tôi hy vọng có một giải pháp tốt hơn. – mbdev

0

Dưới đây là ví dụ về bắt đầu/dừng phương thức được lập biểu trong Khởi động mùa xuân. Bạn có thể sử dụng các API như:
http: localhost: 8080/bắt đầu - để bắt đầu phương pháp lên kế hoạch với lãi suất cố định 5000 ms
http: localhost: 8080/dừng - cho dừng phương pháp dự kiến ​​

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.http.HttpStatus; 
import org.springframework.http.ResponseEntity; 
import org.springframework.scheduling.TaskScheduler; 
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import java.time.Instant; 
import java.util.concurrent.ScheduledFuture; 

@Configuration 
@ComponentScan 
@EnableAutoConfiguration  
public class TaskSchedulingApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(TaskSchedulingApplication.class, args); 
    } 

    @Bean 
    TaskScheduler threadPoolTaskScheduler() { 
     return new ThreadPoolTaskScheduler(); 
    } 
} 

@Controller 
class ScheduleController { 

    public static final long FIXED_RATE = 5000; 

    @Autowired 
    TaskScheduler taskScheduler; 

    ScheduledFuture<?> scheduledFuture; 

    @RequestMapping("start") 
    ResponseEntity<Void> start() { 
     scheduledFuture = taskScheduler.scheduleAtFixedRate(printHour(), FIXED_RATE); 

     return new ResponseEntity<Void>(HttpStatus.OK); 
    } 

    @RequestMapping("stop") 
    ResponseEntity<Void> stop() { 
     scheduledFuture.cancel(false); 
     return new ResponseEntity<Void>(HttpStatus.OK); 
    } 

    private Runnable printHour() { 
     return() -> System.out.println("Hello " + Instant.now().toEpochMilli()); 
    } 

} 
2

Dừng đăng ký @ Hạt đã được lên lịch không phải là tính năng tiêu chuẩn vì quyền truy cập vào chúng là riêng tư trong org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.

Nếu bạn cần quản lý thời gian chạy, bạn cần phải đăng ký chúng theo lập trình (TriggerTask): xem tài liệu theo số org.springframework.scheduling.annotation.SchedulingConfigurer. Trong loại org.springframework.scheduling.config.TriggerTask có phương thức trả về loại org.springframework.scheduling.Trigger. Ở đó bạn có thể quản lý thời gian thực hiện tiếp theo.

TriggerTask s có thể là hạt đậu trong trường hợp đăng ký theo chương trình.

+0

Wow! Lưu ngày của tôi! – Bsalex

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