如何使GAE服务器重复操作?

时间:2014-07-11 20:35:54

标签: java google-app-engine servlets

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

2 个答案:

答案 0 :(得分:3)

您需要使用cron作业:

Scheduled Tasks With Cron for Java

这正是它们的设计目标。

答案 1 :(得分:0)

安德烈·沃尔金的答案是正确的,你需要追求这个链接。

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

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

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

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

现在我们有Queues / Crons来调用系统,而不是UI,但通常,就像在我的情况下,cron调用更“内部”的代码,例如,send-mail被实现为排队的任务需要直接调用系统服务处理程序绕过两个业务逻辑层。同样,ftp-today-transactions是一个需要直接调用绕过业务逻辑层的系统服务的cron。

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

您将不会直接从servlet级别调用sys级别的东西,因为这将是一个特别安全且独立的访问接口已定义直接调用。

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

  1. NudeBusinessObjects上的瘦 - 瘦Http接口[所有BO扩展了这个,并且有一个非Http接口]
  2. 队列中的Thiq - Thiq Http接口
  3. Thin只确保存在所需的参数并传递给处理程序。它总是调用com.mybusiness类,如果需要,它们又调用com.mysystem类。

    Thiq拥有更多代码,即使在自动代码上也需要安全凭据,执行更复杂的验证,并且通常已经为crons / tasks之间的故障定义了高级别行为。它总是调用com.mysystem类。

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