首页 > 解决方案 > 进入网页后每分钟开始执行一个动作

问题描述

我正在使用 Spring 开发 Java Web 应用程序。

我想做的是,在用户进入页面后,代码每 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"))
        ...
}

调度程序(或任何执行自动化操作的程序)应该在用户再次访问触发自动化操作的同一网页时立即停止,并且应该在后台运行而不阻止任何其他代码的执行(准确地说,我不能简单地放一个while 循环与 Sys.sleep 在函数中映射到页面 URL 请求为什么页面应该做其他事情)

有什么帮助吗?

标签: javaspringweb-applications

解决方案


有两种常见的方法来实现这一点。

第一个是在 JavaScript 中运行您的计时器客户端,然后运行 ​​AJAX/websocket/whatever 调用。这有很多优点——一旦用户离开您的站点,计时器就会停止,并且您不会占用服务器端资源,因此您的应用程序可以更干净地扩展。如果您的计时器链接到单个用户,这是迄今为止最干净的解决方案。

二是使用消息队列;在队列中弹出一条消息并让一个异步进程检查这些消息,理想情况下在单个数据库请求中聚合多个客户端会话。您需要弄清楚如何检测会话超时并从消息队列中删除消息。当您的计时器正在查看与当前用户没有紧密联系的信息时,这种方法是最好的。


推荐阅读