我在部署项目时启动了spring Scheduled方法的问题,所以我想知道是否有一个方法可以在用户验证后启动Scheduled任务
@Scheduled(initialDelay=10000, fixedRate = 5000)
public void sendGpsData() throws Exception {
System.out.println("sendGpsData");
this.template.convertAndSend("/gps-data/send", new Greeting("Ahmed WAFDI"));
}
请注意,我每隔5秒就使用套接字发送数据。
答案 0 :(得分:2)
您可以在用户进行身份验证时动态安排作业。因此,在处理用户身份验证的某个地方,您将开始计划。从@Scheduled
方法中删除sendGpsData
注释,然后在用户进行身份验证时执行:
TaskScheduler scheduler = // injected by spring;
ScheduledFuture scheduledFuture = scheduler.schedule(() -> sendGpsData(), new PeriodicTrigger(5000));
// You can later unschedule the job if you'd like to by doing
scheduledFuture.cancel(true);
答案 1 :(得分:0)
所以我想分享我的解决方案,但在此之前是关于我遇到的问题的一些细节,我有一张地图,我想每2秒发送一次gps coordiante,所以我在我的控制器中使用了spring websocket注射像@Brian Ecker说的
@Autowired
private TaskScheduler scheduler;
@Autowired
private SimpMessagingTemplate template;
和显示地图的int方法我启动了计划任务
@RequestMapping(value = {"/tracking"}, method = RequestMethod.GET)
public ModelAndView trackingPage() {
ModelAndView model = new ModelAndView();
model.setViewName("track/tracking");
User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
ScheduledFuture scheduledFuture = scheduler.schedule(() -> sendGpsData(user), new PeriodicTrigger(2000));
return model;
}
这里是将数据发送到socket
的方法 public void sendGpsData(User user) {
System.out.println(user.getUsername());
this.template.convertAndSendToUser(user.getUsername(), "/gps-data/send", user);
}