我有一个@Scheduled
任务,它通过websocket每秒向客户端发送数据。
我的需求是只在客户端请求时才开始运行我的计划任务。
代替,我的任务在我的服务器启动时启动。这不是我想要的行为。
目前,我有一个计划任务的bean,它在我的SchedulingConfigurer中声明:
@Configuration
@EnableScheduling
public class SchedulingConfigurer implements org.springframework.scheduling.annotation.SchedulingConfigurer {
@Bean
public ThreadPoolTaskScheduler taskScheduler() {
return new ThreadPoolTaskScheduler();
}
@Bean
public ScheduledTask scheduledTask() {
return new ScheduledTask();
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setTaskScheduler(taskScheduler());
}
}
这是我的弹簧控制器代码:
@MessageMapping("/hello")
public void greeting() throws Exception {
//How do I start my scheduled task here ?
}
也许是不可能做到这一点与@Scheduled
注释,我必须使用TaskScheduler
接口?
- 从scheduletask类中删除@Scheduled声明
-
实现可运行接口而不是
@Component //@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ScheduledTask implements Runnable { private static final Logger log = LoggerFactory.getLogger(ScheduledTask.class); private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); public void doWork() { printMessage(); // TODO real work } private void printMessage() { log.info("time to work: {}", dateFormat.format(new Date())); } @Override public void run() { doWork(); } }
-
像这样安排你在控制器区域的任务
@Controller public class ScheduledTaskController { @Autowired private TaskScheduler taskScheduler; @Autowired private ScheduledTask scheduledTask; @RequestMapping(value = "/task/run", method = RequestMethod.GET) public String runTask() { // start to run task every 5 sec. taskScheduler.schedule(scheduledTask, new CronTrigger("0/5 * * * * ?")); // ok, redirect return "redirect:/task"; } }
@Schedule是声明性的方式,所以不是你在这里想要达到的目的。
您可以使用TaskScheduler实现之一创建Bean,例如ThreadPoolTaskScheduler,并将该Bean注入到应用程序中。它具有动态调度任务所需的所有方法。