2

Как сопоставить сервлет с URL-адресом cron? Этот вопрос вытекает из комментария к ответу в следующем посте: Use Cron jobs with Appengine Endpoints APIКарта сервлета на cron url?

В моем проекте работа хрон называется, как показано в журнале в Google App Engine и URL https://[url-commented-out].appspot.com/_ah/api/stocksApi/v1/stocks выполняется должным образом при тестировании в веб-браузере и возвратов правильное значение.

Но я получаю ошибку 405: HTTP-метод GET не поддерживается этим URL-адресом, когда я пытаюсь запустить его в GAE. Я прочитал 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 и I имеют файл StocksEndpoint.java с getStocks(); метод, который возвращает акции.

ответ

-1

К сожалению, URL-адреса под /_ah/api ограничены и не могут быть вызваны из вашего приложения. Существует несколько способов обойти это, но наиболее приемлемым вариантом является, как правило, использовать обычный сервлет, чтобы обслуживать запросы Cron, а не подключаться к конечной точке.

1

Сначала добавьте отображение сервлета для хрон в 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> 

забудьте обновить класс сервлета для сервлета!


Тогда, наконец, поставить новый хрон 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> 
Смежные вопросы