我有一个@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
界面?
答案 0 :(得分:1)
实现Runnable接口而不是
$_SERVER['REQUEST_URI']
在此控制器区域安排您的任务
@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();
}
}
答案 1 :(得分:0)
@Schedule是声明性的方式,所以不是你想在这里实现的目的。
您可以使用TaskScheduler实现之一创建Bean,例如ThreadPoolTaskScheduler,并在您的应用程序中注入该bean。 它具有动态调度任务的所有必要方法。