【问题标题】:How do you get app engine cron jobs to show in "scheduled tasks" tab on the web interface?如何让应用程序引擎 cron 作业显示在 Web 界面的“计划任务”选项卡中?
【发布时间】:2025-12-18 15:10:01
【问题描述】:

我一直在构建一个应用程序,用于将 Google 分析数据从 Bigquery 的数据集中移动到 Google 存储。

我的目的是在 Google App Engine 上部署一个网络应用程序并设置一些 cron 作业来定期调用正确的 URL,然后让一些 servlet 来管理这些请求。

我正在 eclipse 上开发并使用谷歌在此处https://developers.google.com/eclipse/ 提供的 App Engine 插件。

使用这个插件,我创建了一个“基于 Maven 的 Google App Engine 标准 Java 项目”,其中包含一个简单的 java servlet HelloAppEngine.java、一个基本的 index.jsp 页面和一个带有简单方法的类。这是这三个的代码,web.xml 和 appengine-web.xml 也是。

HelloAppEngine.java:

import java.io.IOException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloAppEngine extends HttpServlet {

  @Override
  public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws IOException {

    response.setContentType("text/plain");
    response.getWriter().println("Hello App Engine!");

  }
}

index.jsp:

<!DOCTYPE html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="bigqueryexport.HelloInfo" %>
<html>
<head>
  <link href='//fonts.googleapis.com/css?family=Marmelad' rel='stylesheet' type='text/css'>
  <title>Hello App Engine Standard</title>
</head>
<body>
    <h1>Hello App Engine -- Standard!</h1>

  <p>This is <%= HelloInfo.getInfo() %>.</p>
  <table>
    <tr>
      <td colspan="2" style="font-weight:bold;">Available Servlets:</td>
    </tr>
    <tr>
      <td><a href='/hello'>The servlet</a></td>
    </tr>
  </table>

</body>
</html>

这是 web.xml:

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">
  <servlet>
    <servlet-name>HelloAppEngine</servlet-name>
    <servlet-class>bigqueryexport.HelloAppEngine</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloAppEngine</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

最后,appengine-web.xml:

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
    <threadsafe>true</threadsafe>
    <system-properties>
        <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
    </system-properties>
</appengine-web-app>

到目前为止,我还没有编写任何代码,当我将此代码部署到 Google 平台时一切正常。现在,根据https://cloud.google.com/appengine/docs/standard/java/config/cron 的说法,只需添加一个带有正确代码的 cron.xml 文件并再次部署应用程序,它就可以开始使用了。这是我在 appengine-web.xml 所在的同一文件夹中创建的 cron.xml。

<?xml version="1.0" encoding="UTF-8"?>
<cronentries>
  <cron>
    <url>/hello</url>
    <description>test cron job</description>
    <schedule>every 3 minutes</schedule>
  </cron>
</cronentries>

根据上面提供的文档,这应该创建每 3 分钟对我的 servlet 执行一次 get 请求的计划任务,但是当我再次部署应用程序时,cron 作业不会显示在 google 平台界面上,并且它也不会每 3 分钟运行一次。

我在这里错过了什么?

谢谢

PS:这是控制台上编译输出的内容。

开始与模块默认交互... 0% 正在扫描 jsp 文件。 0% 编译 jsp 文件。 2017 年 4 月 4 日下午 4:34:24 org.apache.jasper.JspC processFile INFORMACI�N:构建文件:\index.jsp 警告:[选项] 引导类路径未与 -source 1.7 Success 一起设置。 模块默认目录的临时暂存留在 D:\某路径 您即将部署以下服务: - 项目 ID/默认/20170404t163438(来自 [D:\somepath\app.yaml]) 部署到 URL:[https://project-id.appspot.com]

开始部署服务 [默认]... 文件上传完成。 更新服务 [默认]......................................完成。 将服务 [默认] 部署到 [https://project-id.appspot.com]

您可以通过运行以下命令从命令行流式传输日志:$ gcloud app 记录tail -s default

要在网络浏览器中查看您的应用程序,请运行:$ gcloud app browse

【问题讨论】:

  • 我刚刚尝试了您执行的步骤,它显示在我的云控制台中的 App Engine > 任务队列 > Cron 作业下。虚拟问题:您是否在创建 cron.xml 后重新运行部署?您是否在部署控制台中看到类似 Uploading cron jobs. 的行?
  • 检查上传 cron 作业的两种方法 - 有时上传整个应用程序不会上传 cron 作业(或者至少在 python 中它没有,而 update_cron 一个有)。 cloud.google.com/appengine/docs/standard/java/config/…
  • 你检查创建的war文件了吗?它是否包含 cron.xml 文件?您使用的是哪个 sdk 版本?
  • 您能说明一下您使用的是哪个插件吗?它是(旧的)Google Plugin for Eclipse(在 developer.google.com/eclipse 上引用)还是(新)Cloud Tools for Eclipse(在 cloud.google.com/eclipse 上引用)?如果是后者,那么这是一个bug,修复它的新版本(1.0.2)刚刚发布,所以请更新。
  • 我通过更新 Eclipse 插件解决了这个问题。我仍然阅读相同的“Google Cloud Tools for Eclipse 1.0.2”,但有些事情发生了变化,因为现在它确实部署了 cron 作业。谢谢大家

标签: java google-app-engine servlets cron google-bigquery


【解决方案1】:

仅供参考,您可以在 {buildOutputPath}/appengine-staged/WEB-INF/appengine-generated/ 目录中找到 cron.yaml 文件。

gcloud app deploy --project=yourprojectname cron.yaml 会将 cron 作业部署到您的项目中。

【讨论】:

    【解决方案2】:

    确保您至少使用 1.0.2 版本的 Cloud Tools for Eclipse 插件,其中包含此问题的修复程序。供参考:相关问题:https://github.com/GoogleCloudPlatform/google-cloud-eclipse/issues/1676 和相关 PR:https://github.com/GoogleCloudPlatform/google-cloud-eclipse/pull/1690

    【讨论】:

      最近更新 更多