java - 进入网页后每分钟开始执行一个动作
问题描述
我正在使用 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 请求为什么页面应该做其他事情)
有什么帮助吗?
解决方案
有两种常见的方法来实现这一点。
第一个是在 JavaScript 中运行您的计时器客户端,然后运行 AJAX/websocket/whatever 调用。这有很多优点——一旦用户离开您的站点,计时器就会停止,并且您不会占用服务器端资源,因此您的应用程序可以更干净地扩展。如果您的计时器链接到单个用户,这是迄今为止最干净的解决方案。
二是使用消息队列;在队列中弹出一条消息并让一个异步进程检查这些消息,理想情况下在单个数据库请求中聚合多个客户端会话。您需要弄清楚如何检测会话超时并从消息队列中删除消息。当您的计时器正在查看与当前用户没有紧密联系的信息时,这种方法是最好的。
推荐阅读
- unity3d - Unity 网络:使用同步列表字符串
- ios - 如何在 UIswitch 打开和关闭时上下移动标签?
- python-2.7 - 为什么这种错误的 python 格式会产生这个结果而不是异常?
- javascript - 键入时将字符更改为星号
- javascript - ReactJS 中的重组件在 IE 浏览器上执行缓慢
- bash - 替换多个文件中的多个字符串
- ruby-on-rails - 如何在没有 RubyInstaller 2.3.4 的情况下在 Windows 上安装 ruby 2.3.4?
- angular - 我如何从角度 5 中的其他组件更新组件数据
- neural-network - Yolo v3不能设置小于三个的bounding box的个数吗?
- string - Makefile - 操作像 Bash 这样的字符串