1

@ScheduledWebsocket を介して毎秒クライアントにデータを送信するタスクがあります。

クライアントが要求したときにのみ、スケジュールされたタスクの実行を開始する必要があります。

代わりに、サーバーの起動時にタスクが開始されます。それは私が望む動作ではありません。

現在、 SchedulingConfigurer で宣言されているスケジュールされたタスクの Bean があります。

@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 に答える