config用户身份验证后启动的Spring计划任务

时间:2017-05-13 14:11:10

标签: java spring websocket scheduled-tasks

我在部署项目时启动了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秒就使用套接字发送数据。

2 个答案:

答案 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);
    }