我正在使用spring开发一个javaweb应用程序。
我想做的是,在用户到达一个页面后,代码每10秒就开始运行一个函数,跟踪最后一个操作的执行时间。
我试着用一个调度器来实现,但它会立即开始运行——而且不仅仅是在用户到达一个页面之后。
@Scheduled(fixedRate = 60000)
public void run(String param) {
//just an example of action to be performed repeatedly
System.out.println("Previously performed action was " + new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(previousActionTime)) + " with " + param);
//update previousActionTime
previousActionTime.setSeconds(previousActionTime.getSeconds() + 10);
}
此外,我不知道什么是一种方便的方法来存储最后一个动作自动执行的时间。
浏览页面时,应以某种方式激活计划程序:
@RequestMapping(value = "/hellopage", method = { RequestMethod.POST, RequestMethod.GET })
public String hellopage(HttpServletRequest request, HttpServletResponse response) {
// Activate scheduler
run(request.getParameter("param1"))
...
}
调度器(或执行自动操作的任何程序)应该在用户再次进入触发自动操作的同一网页时立即停止,并且应该在后台运行,不阻止任何其他代码的执行(准确地说,我不能简单地在Map到页面url请求的函数中使用sys.sleep设置while循环(为什么页面应该做其他事情)
有什么帮助吗?
2条答案
按热度按时间0s0u357o1#
考虑使用
ScheduledExecutorService.scheduleAtFixedRate
为此,spring调度程序独立于任何用户的请求(您已经观察到并注意到了这一点)。你可以用
shutdownNow
一旦用户的会话不再有效/收到新请求,就终止计划程序。为了实现这一点,您可以使用用户id(或任何相关信息)维护先前执行者的缓存,以标识应该失效的示例。作为你可以使用的另一种选择
Timer
以及TimerTask
如果需要更细粒度的控制(但此处不建议)t3irkdon2#
实现这一点有两种常见的方法。
首先是在javascript中运行计时器客户端,然后运行ajax/websocket/whatever调用。这有很多优点—一旦用户离开您的站点,计时器就会停止,并且您不会占用服务器端资源,因此您的应用程序可以更清晰地扩展。如果您的计时器链接到单个用户,这是迄今为止最干净的解决方案。
二是使用消息队列;在队列中弹出一条消息,并让一个异步进程检查这些消息,理想情况下是在一个数据库请求中聚合多个客户端会话。您需要弄清楚如何检测会话超时并从消息队列中删除消息。当计时器正在查看与当前用户没有紧密连接的信息时,这种方法是最好的。