2015-07-31 6 views
2

У меня есть приложение Spring Boot, в котором выполняется определенное количество заданий в определенное время дня (настроено CRON). Теперь я обнаружил, что приложение работает, но запланированные задания не выполняются. Есть ли способ добавить тайм-аут к задаче, аннотированной с помощью @Scheduled в Spring.Как отключить Spring Spring @Scheduled Thread

Так что, даже если задание заблокировано или ждет, его можно убить, чтобы другие потоки могли выполняться плавно. Поток может подождать определенное время, а затем, если задача не завершена, уничтожьте поток.

Я знаю, что я могу увеличить PoolSize с помощью:

Executors.newScheduledThreadPool();

Но что произойдет, если в конечном итоге все потоки блокируются

Я просмотрел форум и увидел решения, упомянутые с помощью FutureTasks. Может ли это быть применено к задаче с аннотацией @Scheduled? Поскольку приложение имеет весеннюю загрузку, для конфигурации тайм-аута нет конфигурации xml.

ответ

1

Для запуска и управления задачами вы можете использовать TaskScheduler. В вашем @Configuration классе:

@Configuration 
public class YourConfig { 

    @Bean 
    public TaskScheduler scheduler() { 
    return new ThreadPoolTaskScheduler(); 
    } 
    // ... 

После этого, вы можете запланировать задачу таким образом:

@Service 
public class YourTaskRunnable implements Runnable { 

    @Autowired 
    private TaskScheduler scheduler; 

    @PostConstruct 
    private void init() { 
    ScheduledFuture future = this.scheduler.schedule(this, /* to execute immediately, for example */ Calendar.getInstance().getTime()); 
    // ... 
    } 


    @Override 
    public void run() { 
    // Your task code ... 
    } 
} 
+0

Я планирования их в определенное время CRON с использованием @scheduled. С помощью метода, предоставленного вами, можно ли удержать тайм-аут? Я хочу, чтобы поток был убит или прерван, если он не завершит выполнение через некоторое время. Чтобы другие потоки не прерывались. – javaEd

+0

Да, вы можете сохранить экземпляр ScheduledFuture и проверить с помощью isDone() и отменить() его. Вы можете проверить использование: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledFuture.html –