Работа в Google Cloud App Engine cron - не вызывая службу - PullRequest
1 голос
/ 06 июня 2019

Я успешно развернул задание Cron в App Engine для приложения Java, использующего стандартную среду App Engine. Он успешно развертывается, однако задание cron не выполняется, и когда я проверяю журнал, он не вызывает правильный сервис:

"GET /my-app HTTP/1.1" 404 - - "AppEngine-Google; (+http://code.google.com/appengine)"
"my-project.appspot.com"

Другие рабочие задания cron выглядят следующим образом (обратите внимание, что в последней части отображается имя службы , а не только имя проекта):

"GET /my-app HTTP/1.1" 404 - - "AppEngine-Google; (+http://code.google.com/appengine)"
"my-service.my-project.appspot.com"

Вот мой cron.xml :

<?xml version="1.0" encoding="UTF-8"?>
<cronentries>
    <cron>
        <url>/my-app</url>
        <description>my app</description>
        <schedule>every 1 minutes from 00:00 to 23:00</schedule>
        <timezone>Europe/Paris</timezone>
    </cron>
</cronentries>

И мой web.xml :

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

  <servlet>
      <servlet-name>my-app</servlet-name>
      <servlet-class>com.my.package.MyApp</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>my-app</servlet-name>
      <url-pattern>my-app</url-pattern>
  </servlet-mapping>


</web-app>

И мое определение сервлета (это приложение Cloud Endpoint, в котором используется сервлет Java):

@WebServlet(
        name = "my-app",
        urlPatterns = {"/my-app"}
)
public class MyApp extends HttpServlet {
   ...

И мой appengine-web.xml :

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
  ....    

  <application>my-project</application>
  <service>my-app</service>

  ....

</appengine-web-app>

Почему cron не звонит в службу? Служба также правильно развернута.

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Из официальных документов :

В следующем примере создается базовое задание cron, которое выполняется ежедневно:

<?xml version="1.0" encoding="UTF-8"?>
<cronentries>
  <cron>
    <url>/tasks/summary</url>
    <target>beta</target>
    <description>daily summary job</description>
    <schedule>every 24 hours</schedule>
  </cron>
</cronentries>

Целевая спецификация является необязательной иэто название службы / версии.Если присутствует, цель добавляется к имени хоста вашего приложения, в результате чего задание направляется на эту службу / версию.Если цель не указана, задание будет выполняться в версиях службы по умолчанию, настроенных для трафика.

Я думаю, что это происходит в вашем случае.Поскольку вы не указали target, задание cron обращается к маршруту / my-app в службе по умолчанию.Упомяните название сервиса в цели.

1 голос
/ 06 июня 2019

My cron.xml требуется <target>, который соответствует <service> в моем appengine-web.xml

cron.xml

<?xml version="1.0" encoding="UTF-8"?>
<cronentries>
    <cron>
        <url>/my-app</url>
        <!-- <target> required -->
        <target>my-app</target>
        <description>my app</description>
        <schedule>every 1 minutes from 00:00 to 23:00</schedule>
        <timezone>Europe/Paris</timezone>
    </cron>
</cronentries>

appengine-web.xml

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
  ....    

  <application>my-project</application>
  <!-- cron <target> must match service -->
  <service>my-app</service>

  ....

</appengine-web-app>
...