【问题标题】:Map a servlet to a cron url?将 servlet 映射到 cron url?
【发布时间】:2015-06-03 18:51:01
【问题描述】:

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

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

但是当我尝试在 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() 的文件;返回股票的方法。

【问题讨论】:

    标签: google-app-engine servlets android-studio cron google-cloud-endpoints


    【解决方案1】:

    首先为你的 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 类!


    然后最后把新的 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>
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2012-01-20
        • 2017-09-21
        • 1970-01-01
        • 2018-11-24
        • 2011-07-09
        • 2016-01-02
        • 1970-01-01
        • 1970-01-01
        • 2015-07-17
        相关资源
        最近更新 更多