Остановить задание планирования из конечной точки покоя

Я делаю проект Spring Boot

это основной класс

@SpringBootApplication
@ComponentScan(basePackages="blabla.quartz")
@EnableScheduling
public class App 
{
    public static void main( String[] args )
    {
        ConfigurableApplicationContext context =SpringApplication.run(App.class, args);     
    }

}

это контроллер

@RestController
public class Controller {

    @Autowired
    private SampleTask m_sampletask;

    @Autowired TaskScheduler taskScheduler;

    ScheduledFuture scheduledFuture;
    int jobid=0;

    @RequestMapping(value = "start/{job}", method = RequestMethod.GET)
    public void start(@PathVariable String job) throws Exception {
        m_sampletask.addJob(job);

        Trigger trigger = new Trigger(){

            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                org.quartz.CronExpression cronExp=null;
                CronSequenceGenerator generator = new CronSequenceGenerator("0 * * ? * *");
                Date nextExecutionDate = generator.next(new Date());
                System.out.println(nextExecutionDate);              
                return nextExecutionDate;

            }

        };                          
        scheduledFuture = taskScheduler.schedule(m_sampletask, trigger);

    }

}

Это реализация ScheduleConfigurer

@Service
public class MyTask implements SchedulingConfigurer{    

    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setThreadNamePrefix("somegroup-");
        scheduler.setPoolSize(10);      
        scheduler.setWaitForTasksToCompleteOnShutdown(true);
        scheduler.setAwaitTerminationSeconds(20);
        return scheduler;
    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    }   

}

Это класс, который я вызываю из контроллера как запланированное задание.

@Component
public class SampleTask implements Runnable{

    private List<String> jobs=new ArrayList<String>();
    private String jobName;

    public void addJob(String job){
        jobName=job;
    } 

    @Override
    public void run() {     
        System.out.println("Currently running "+jobName);       
    }
}

Как остановить запланированное задание с помощью конечной точки отдыха (предположим, «/stop/{jobname}»). Когда я запустил задание, используя конечную точку отдыха «/start/{jobname}»?


person Community    schedule 31.10.2017    source источник


Ответы (1)


Вам, вероятно, потребуется использовать кварцевый планировщик (если он еще не установлен) и добавить службу с необходимыми методами, а затем внедрить эту службу в ваш контроллер.

Здесь есть достойный пример: https://github.com/javabypatel/spring-boot-quartz-demo

Если вам нужно хранилище заданий в памяти (это не база данных), проверьте RAMJobStore: http://www.quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigRAMJobStore.html

Пример остановки

Это отрывок из демонстрационного проекта. Кредит принадлежит Джаешу Пателю: https://github.com/javabypatel

/**
 * Stop a job
 */
@Override
public boolean stopJob(String jobName) {
    System.out.println("JobServiceImpl.stopJob()");
    try{    
        String jobKey = jobName;
        String groupKey = "SampleGroup";

        Scheduler scheduler = schedulerFactoryBean.getScheduler();
        JobKey jkey = new JobKey(jobKey, groupKey);

        return scheduler.interrupt(jkey);

    } catch (SchedulerException e) {
        System.out.println("SchedulerException while stopping job. error message :"+e.getMessage());
        e.printStackTrace();
    }
    return false;
}
person Pytry    schedule 31.10.2017
comment
Эй, Питри. Спасибо за ваш ответ ... но у меня нет базы данных в моем приложении, которая необходима для кварца. - person ; 31.10.2017
comment
Quartz не требует, чтобы у вас была постоянная база данных для вашего магазина заданий. Вы можете использовать встроенную базу данных в памяти, такую ​​​​как H2, или вы также можете использовать RAMJobStore (см. обновленный ответ). - person Pytry; 02.11.2017