Rails中服务器端的定时器

时间:2017-02-14 20:54:32

标签: ruby-on-rails timer background

我想要达到的目标是: 1.用户按下按钮并启动限时表格。 2.定时器启动。 3.在计时器达到0并且用户未完成表单的X时间之后,rails在数据库中创建记录并执行一些会话清理操作(Model.create和session.delete)。

如果用户启动表单然后变得不可用(关闭web浏览器或关闭PC),此计时器将像安全措施一样工作。

你能指出我正确的方向吗?我应该从哪里开始?我应该使用什么语言/框架来做到这一点?

1 个答案:

答案 0 :(得分:0)

您可以使用时间戳记录发生的事情。 Rails已在updated_atcreated_at字段中提供了一个很好的示例。

当用户第一次开始填写表单时,您可以重复使用此概念,可能是在资源的new路径上,这通常与表单的开头一致。

至于执行清理,你有两个选项甚至可以一起工作,具体取决于具体情况:

  1. 如果清理不是安全敏感的,您可以在前端启动计时器,然后在到期时向后端发送AJAX请求。
  2. 如果清理不是时间敏感的,您可以每隔几分钟左右run a task执行清理任务尚未清理的表格。它会查看时间戳来确定这一点。
  3. 除了这些建议之外,我们还必须了解您的用例以了解更多问题。

    1. 清理时间敏感吗?
    2. 清理安全敏感吗?
    3. 还有更多选项 - 您可以更精细或更安全地运行任务。

      紧迫时间

      如果你的时间非常紧张(低至秒),一个选项是实现上述两个选项,此外还有以下功能:

      1. 使用ActionCable使用户保持Web套接字打开。定期让他们ping服务器以检查其状态。
      2. before_filter中,可能在ApplicationController中,首先检查他们是否有权继续操作,即时间戳还没有过期。如果时间戳已过期,并且尚未执行清理,则立​​即执行。
      3. 这种方法的局限性:

        1. 如果用户完全关闭网站,则在下一次清理任务发生之前不会进行清理。
        2. 前端存在漏洞。用户可以禁用前端检查,然后避免提交表单,这将以与#1相同的方式延迟清理。