是否可以手动调用弹簧预定方法

时间:2018-05-03 09:41:57

标签: spring spring-boot cron spring-scheduled

有没有办法通过用户交互调用弹出预定方法(作业)?我需要创建一个显示所有作业的表,用户应该能够手动执行它们。确保作业自动运行,但用户应该能够手动启动它们。

@Configuration
@EnableScheduling
public class ScheduleConfiguration {

    @Bean
    public ScheduledLockConfiguration taskScheduler(LockProvider 
     lockProvider) {
        return ScheduledLockConfigurationBuilder
                .withLockProvider(lockProvider)
                .withPoolSize(15)
                .withDefaultLockAtMostFor(Duration.ofHours(3))
                .build();
    }

    @Bean
    public LockProvider lockProvider(DataSource dataSource) {
        return new JdbcTemplateLockProvider(dataSource);
    }
}

@Component
public class MyService {

    @Scheduled(fixedRateString = "1000")
    @SchedulerLock(name = "MyService.process", lockAtLeastFor = 30000)
    @Transactional
    public void process() {
        // do something
    }
}

1 个答案:

答案 0 :(得分:0)

以下是使用TaskScheduler的示例:

创建将手动计划和调用的任务:

@Component
public class SomeTask implements Runnable {

    private static final Logger log = LoggerFactory.getLogger();

    @Autowired
    public SomeDAO someDao;

    @Override
    public void run() {
        // do stuff
    }
}

创建TaskScheduler bean:

@Configuration
public class TaskSchedulerConfig {

    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(5);
        threadPoolTaskScheduler.setThreadNamePrefix("ThreadPoolTaskScheduler");
        return threadPoolTaskScheduler;
    }
}

用于定期执行的计划任务:

@Component
public class ScheduledTasks {
    @Autowired private TaskScheduler taskScheduler;

    // Tasks
    @Autowired private SomeTask task1; // autowired in case the task has own autowired dependencies
    @Autowired private AnotherTask task2;

    @PostConstruct
    public void scheduleTasks() {
        taskScheduler.schedule(task1, new PeriodicTrigger(20, TimeUnit.SECONDS));
        taskScheduler.schedule(task2, new CronTrigger("0 0 4 1/1 * ? *"));
    }
}

通过http请求手动调用任务:

@Controller
public class TaskController {

    @Autowired private TaskScheduler taskScheduler;

    // Tasks
    @Autowired private SomeTask task1;

    @RequestMapping(value = "/executeTask")
    public void executeTask() {
        taskScheduler.schedule(task1, new Date()); // schedule task for current time
    }
}