2011-08-18 28 views
7

Czy istnieje sposób uruchomienia lub zatrzymania zadania zaplanowanego przy użyciu wiosennych zaplanowanych zadań zainicjowanych przy użyciu pliku kontekstowego lub @splanowanej adnotacji?Spring ScheduledTask - uruchomienie/zatrzymanie wsparcia?

Chciałbym rozpocząć zadanie, gdy jest to wymagane i zatrzymać, gdy zadanie nie jest już potrzebne do uruchomienia.

Jeśli nie jest to możliwe, istnieje alternatywa dla wtłaczania zmiennych sprężystych do wątku?

Odpowiedz

1

Metoda @Scheduled szuka zmiennej przechowywanej w stanie Application lub ServletContext lub z wartości przechowywanej w bazie danych. Jeśli wartość ma wartość TRUE, należy wykonać zadanie; jeśli FALSE, nie zaczynaj. Ta konfiguracja kontroluje zaplanowane uruchomienie.

Jeśli chcesz mieć możliwość wywołania zadania dowolnie, odwołaj się do metody zadania ze sterownika; w ten sposób możesz strzelać do woli. Dodatkowo, jeśli jest to dłużej działające zadanie, utwórz drugą metodę z przypisaną wartością @Async i wywołaj tę metodę ze sterownika, aby działała we własnym wątku.

+0

Kiedy mówisz "nie uruchamiaj", nie można tego zrobić, Spring uruchomi tę funkcję co X sekund. Nie ma mechanizmu "startowego". – mbdev

+0

Chciałem wyjść z metody lub zrobić coś innego, aby funkcja biznesowa metody nie została wykonana. – atrain

+0

Cóż, myślę, że metoda będzie kontynuować wykonywanie funkcji, mimo że kończy. Mam nadzieję, że istnieje lepsze rozwiązanie. – mbdev

0

Oto przykład uruchamiania/zatrzymywania zaplanowanej metody w Spring Boot. Można używać takich API:
http: localhost: 8080/rozpocząć - do rozpoczęcia metody zaplanowane ze stałą szybkością 5000 ms
http: localhost: 8080/Stop - za zatrzymanie sposób zaplanowany

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

Zatrzymywanie zarejestrowanych @Schedpled beans nie jest standardową funkcją, ponieważ dostęp do nich jest prywatny w org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.

Jeśli potrzebujesz zarządzać czasem ich uruchomienia, musisz je zarejestrować programowo (TriggerTask): zapoznaj się z dokumentacją pod numerem org.springframework.scheduling.annotation.SchedulingConfigurer. W typie org.springframework.scheduling.config.TriggerTask znajduje się metoda, która zwraca typ org.springframework.scheduling.Trigger. Tam możesz zarządzać następnym czasem realizacji.

TriggerTask s może być fasolką w przypadku rejestracji programowej.

+0

Wow! Uratowałem mój dzień! – Bsalex

Powiązane problemy