Spring:通过@Controller和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接口?

  1. 从scheduletask类中删除@Scheduled声明
  2. 实现可运行接口而不是

    @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";
      }
    }
    

@Schedule是声明性的方式,所以不是你在这里想要达到的目的。

您可以使用TaskScheduler实现之一创建Bean,例如ThreadPoolTaskScheduler,并将该Bean注入到应用程序中。它具有动态调度任务所需的所有方法。

相关内容

  • 没有找到相关文章

最新更新