1

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

4

2 回答 2

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

    @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();
        }
    }
    
  3. 像这样在控制器区域安排您的任务

    @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";
      }
    }
    
于 2016-05-17T08:40:47.647 回答
0

@Schedule 是声明方式,因此不是您要在此处达到的目的。

您可以使用 TaskScheduler 实现之一(例如ThreadPoolTask ​​Scheduler)创建一个 Bean,并将该 bean 注入您的应用程序。它具有动态调度任务的所有必要方法。

于 2014-06-03T13:17:14.040 回答