【问题标题】:Start performing an action every minute after getting to a web page进入网页后每分钟开始执行一个动作
【发布时间】:2021-05-30 18:36:48
【问题描述】:

我正在使用 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"))
        ...
}

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

有什么帮助吗?

【问题讨论】:

  • 您对这些自动化操作的具体计划是什么?在我看来,您应该让调度程序部分在您的网络应用程序中运行。可能是一段 javascript,每 10 秒向服务器发送一次触发器。如果您使用调度程序运行它,您将如何检测用户是否仍在页面上并避免无限运行的调度程序?
  • 调度程序需要执行的操作是一个 SQL 查询,用于从数据库中获取一些数据并将其发送到我的 Java 程序以执行一些计算。如何避免无限运行调度程序 - 不幸的是不知道。

标签: java spring web-applications


【解决方案1】:

请考虑为此使用ScheduledExecutorService.scheduleAtFixedRate,因为 Spring 调度程序独立于任何用户的请求(您已经观察并注意到有问题)。

一旦用户会话不再有效/收到新请求,您可以使用shutdownNow 终止调度程序。为此,您可以使用用户 ID(或任何相关信息)维护先前执行程序的缓存,以识别应该失效的实例。

如果需要更细粒度的控制,您可以使用TimerTimerTask 作为替代方案(但不建议使用here

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-02-28
      • 2014-03-07
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 2013-02-03
      相关资源
      最近更新 更多