Spring:@Scheduled任务通过@Controller和Websocket触发

时间:2014-06-02 13:50:10

标签: spring websocket scheduled-tasks spring-websocket

我有一个@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界面?

2 个答案:

答案 0 :(得分:1)

  1. 从ScheduledTask类中删除@Scheduled声明
  2. 实现Runnable接口而不是

    $_SERVER['REQUEST_URI']
  3. 在此控制器区域安排您的任务

    @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。 它具有动态调度任务的所有必要方法。