无法在非默认服务上的appengine中运行会话清理cron

时间:2018-08-02 21:09:10

标签: java google-app-engine

我有一个运行在应用引擎标准上的Java网络应用。

它曾经在我的项目中作为默认服务运行,并且我有此cron作业来清除旧的会话: https://groups.google.com/forum/#!msg/google-appengine-java/Tw2a8cYz05o/UgsWaoQhWYcJ

我正在遵循此文档将我的整体Web应用程序拆分为微服务: https://cloud.google.com/appengine/docs/standard/java/microservices-on-app-engine

前端和后端都在Java Web应用程序中,但是现在我正在React.js中开发一个前端,并将该前端作为默认服务运行在同一应用程序引擎项目中(使用nodejs运行时)。

Java Web应用程序现在仅将用作后端,因此我将服务设置为:<service>backend</service>

我使用dispatch.yaml文件将/ static /路径指向前端,并将所有其他路径指向后端。

# Rules for dispatch file...
# Put specific cases at the top, other
dispatch:
# Apart from the react frontend on a custom url.
  - url: "blindepoule.appspot.com/static/*"
    service: default
# Route the rest to the backend
  - url: "blindepoule.appspot.com/*"
    service: backend

这很好用!但是sessioncleanup cron作业现在失败了: enter image description here

它确实可以直接在特定的服务网址上运行: https://backend-dot-blindepoule.appspot.com/_ah/sessioncleanup?clear

但不在: https://blindepoule.appspot.com/_ah/sessioncleanup?clear

在查看前端服务的日志服务器时,前端似乎收到/ _ah / sessioncleanup调用并返回404。我的dispatch.yaml不会将调用重定向到后端服务。

我想添加一个对dispatch.yaml的显式引用,但是文档说它将忽略并且url以“ _ah”开头。我还阅读了您可以在appengine-web.xml文件中指定目标的信息,但是您必须在其中输入版本。然后,我每次更新版本时都必须对其进行更新(我做了很多,因为它在应用程序引擎中非常容易)。在我的情况下,我希望指定cron作业需要查看后端服务: https://backend-dot-blindepoule.appspot.com/

更新:我试图将servlet更改为不带_ah的路径,将“ _ah”更改为“ api”。

<servlet>
    <servlet-name>_ah_sessioncleanup</servlet-name>
    <servlet-class>com.google.apphosting.utils.servlet.SessionCleanupServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>_ah_sessioncleanup</servlet-name>
    <url-pattern>/api/sessioncleanup</url-pattern>
</servlet-mapping>
<security-constraint>
    <web-resource-collection>
        <web-resource-name>Sessions Removal</web-resource-name>
        <url-pattern>/api/sessioncleanup</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admin</role-name>
    </auth-constraint>
</security-constraint>

这在开发服务器上本地运行时有效,但是在应用引擎上我得到了404(日志显示它在后端服务上得到了404,因此它的映射不正确): https://blindpool.com/api/sessioncleanup?clear 甚至在服务的直接网址上(以前起作用的): https://backend-dot-blindepoule.appspot.com/api/sessioncleanup?clear 如果com.google.apphosting.utils.servlet.SessionCleanupServlet不是来自_ah模式,则可能存在抛出404的先决条件。

我想我可以编写自己的servlet来删除记录。

有什么想法吗?我的完整资料来源:https://github.com/Leejjon/Blindpool

1 个答案:

答案 0 :(得分:1)

_ah/ URL路径是为非常特定的处理程序保留的,调度文件规则不适用于它们。从dispatch.xml reference语法表中的 url 行)中:

  

/ _ ah / 开头的URL路径不会被分发文件路由。

使用 -dot-地址时,它对您有用的事实仅仅是因为在这种情况下,您使用的是Targeted routing,而不是Routing with a dispatch file

但是随着您的服务现在作为后端运行-您是否仍具有与需要清理的基于专用_ah的库兼容的用户会话信息?我以为会话信息现在由前端React服务处理...