将 servlet 映射到 cron url?

Map a servlet to a cron url?

如何将 servlet 映射到 cron url?此问题来自以下 post 中对答案的评论:Use Cron jobs with Appengine Endpoints API

在我的项目中,cron 作业被调用,如 Google App Engine 中的日志所示,并且 url https://[url-commented-out].appspot.com/_ah/api/stocksApi/v1/stocks 在网络浏览器中测试时正确执行 returns 正确的值。

但是我在 GAE 中尝试 运行 时收到错误 405:此 URL 不支持 HTTP 方法 GET。我读过 https://cloud.google.com/appengine/docs/java/config/cron 我在 cron.xml 文件中的代码是:

<?xml version="1.0" encoding="UTF-8"?>
<cronentries>
    <cron>
        <url>/_ah/api/stocksApi/v1/stocks</url>
        <description>Backend Process Stocks</description>
       <schedule>every 1 minutes from 11:10 to 11:30</schedule>
       <timezone>America/New_York</timezone>

    </cron>
 </cronentries>

我的 web.xml 是:

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
    <servlet>
        <servlet-name>SystemServiceServlet</servlet-name>
        <servlet-class>com.google.api.server.spi.SystemServiceServlet</servlet-class>
        <init-param>
            <param-name>services</param-name>
            <param-value>
                [package].StocksEndpoint</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>SystemServiceServlet</servlet-name>
        <url-pattern>/_ah/spi/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
            <servlet-name>SystemServiceServlet</servlet-name>
            <url-pattern>/_ah/api/*</url-pattern>
        </servlet-mapping>
            <security-constraint>
                <web-resource-collection>
                    <web-resource-name>cron</web-resource-name>
                    <url-pattern>/_ah/api/*</url-pattern>
                </web-resource-collection>
                <auth-constraint>
                    <role-name>admin</role-name>
                </auth-constraint>
            </security-constraint>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    <filter>
        <filter-name>ObjectifyFilter</filter-name>
        <filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>ObjectifyFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

我正在使用 Android Studio 并通过遵循 HelloEndpoints 添加了一个后端模块,我有一个 StocksEndpoint.java 带有 getStocks() 的文件; returns 股票的方法。

不幸的是,/_ah/api 下的网址受到限制,无法从您的应用程序中调用。 有几种方法可以解决这个问题,但最被接受的选择通常是使用常规 servlet 来为 Cron 请求提供服务,而不是连接到端点。

首先为您的 cron 添加一个 servlet 映射到 web.xml:

<!--  stock servlet -->
    <servlet>
        <servlet-name>StockServlet</servlet-name>
        <servlet-class>YOUR.PACKAGE.HERE.StockServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>StockServlet</servlet-name>
        <url-pattern>/cron/stocks</url-pattern>
    </servlet-mapping>

确保为您的 servlet 更新 servlet class!


然后最后将新的 cron url 放入你的 cron.xml:

<cron>
       <url>/cron/stocks</url>
       <description>Backend Process Stocks</description>
       <schedule>every 1 minutes from 11:10 to 11:30</schedule>
       <timezone>America/New_York</timezone>
</cron>