【问题标题】:How to make a GAE server repeat operation?如何让 GAE 服务器重复操作?
【发布时间】:2014-07-11 20:35:53
【问题描述】:

如果我想每分钟更新一次缓存,或者每小时做一些其他事情,我应该把我的代码 (Java) 放在哪里?正如我所想,不在servlet中。你能帮我吗?

【问题讨论】:

    标签: java google-app-engine servlets


    【解决方案1】:

    您需要使用 cron 作业:

    Scheduled Tasks With Cron for Java

    这正是它们的设计目的。

    【讨论】:

      【解决方案2】:

      Andrei Volgin 的回答是正确的,你需要追查链接。

      但是,我想解决您问题中的“不在 servlet 中”部分。我认为您是从设计角度询问代码是否应该驻留在 servlet 类中。我最近为自己回答了这个问题。

      GAE 实现 Cron 和 Tasks 的方式,代码将通过 servlet 调用,因为这些是后台 URL 调用。因此,理论上,代码可以在 servlet 类本身中。如果您使用像 Spring 这样的框架,您可能会有一个入口点 servlet 和您自己的处理程序/管理器/服务。在这种情况下,您可以在处理程序中编写代码。

      在我的项目中,我为所有与 UI 相关的处理创建了一个入口点 servlet。当我需要实现第一个任务队列时,我为队列/c​​rons 创建了另一个入口点 servlet,然后在新的处理程序中进行编码。

      一般来说,您的应用设计看起来类似于 UI ---> Servlet 入口点 1 ---> 通用业务逻辑处理程序 ---> 特定业务逻辑处理程序 --> 系统服务处理程序 ---> 系统服务

      现在我们有 Queues/Crons 调用系统而不是 UI,但一般来说,就像我的情况一样,cron 调用的代码更“内部”,例如,发送邮件被实现为排队任务需要绕过两个业务逻辑层直接调用System Service Handler。同样,ftp-today's-transactions 是一个需要绕过业务逻辑层直接调用系统服务的 cron。

      不直接从 servlet 入口点 1 调用系统服务是有意义的,因为您碰巧有它并在 web.xml 中进行了配置。为更“内部”的队列和 crons 创建另一个入口点更有意义。 然后代码驻留在下一级类(有时称为处理程序)中,如果您使用包来执行它,您可以继续维护层的层次结构。

      然后,您不会对直接从 servlet 级别调用某些 sys 级别的东西感到难过,因为这将是一个特别安全且独立的访问接口定义,可以直接调用。

      为了更直观,我的两个servlet被称为

      1. Thin - NudeBusinessObjects 上的 Thin Http 接口【所有 BO 都扩展了这个,还有一个非 Http 接口】
      2. Thiq - 队列上的 Thiq Http 接口

      Thin 只是确保存在所需的参数并传递给处理程序。它总是调用 com.mybusiness 类,如果需要,它们又会调用 com.mysystem 类。

      Thiq 有更多代码,即使在自动模式下也需要安全凭证,进行更复杂的验证,并且通常为跨 crons/任务的故障定义了高级行为。它总是调用 com.mysystem 类。

      只有我的两分钱。这不是什么大不了的事情,如果你只保留一个入口点并通过在处理程序甚至 servlet 中编写东西来达到相同的效果,它不会导致世界末日。当您制作架构图时,它看起来很丑。

      【讨论】:

        猜你喜欢
        • 2019-09-29
        • 1970-01-01
        • 2013-10-05
        • 1970-01-01
        • 2013-05-29
        • 1970-01-01
        • 1970-01-01
        • 2021-07-19
        • 1970-01-01
        相关资源
        最近更新 更多