1

我在应用程序中有两个模块。第一个模块正在通过推送队列为第二个模块生成任务。两个模块都使用手动缩放。

Queue queue = QueueFactory.getQueue("update-job");
ModulesService ms = ModulesServiceFactory.getModulesService();
queue.add(TaskOptions.Builder.withUrl("/update-job").header("Host", ms.getVersionHostname("batch", ms.getCurrentVersion())));

由于此错误https://code.google.com/p/googleappengine/issues/detail?id=10954 ,我使用“主机”标头将任务路由到第二个应用程序

如果我使用普通的旧 web.xml 进行 servlet 到 url 映射一切正常,所有对版本主机的请求都将成功路由到实例并执行。但是如果我切换到 GuiceFilter 相同的请求将在版本 url 上产生 404。它们在实例 url 上仍然可用,但不会从版本 url 自动路由。两种配置在生产中都可以正常工作,只有 devserver 受到影响。

我显然错过了一些东西,因为我找不到关于这个问题的任何东西。

我尝试了不同的 guice 和 guice-servlet 版本:3.0、3.0.1-SNAPSHOT、3.1.0-SNAPSHOT、4.0-beta4 - 没有结果

也尝试过这种方法https://stackoverflow.com/a/9706953/4070223 - 没有结果

这就是 web.xml 的样子:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
<filter> <!-- does not work -->
    <filter-name>guiceFilter</filter-name>
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>guiceFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<!--<servlet>-->  <!-- works fine -->
    <!--<servlet-name>update-job</servlet-name>-->
    <!--<servlet-class>com.company.UpdateJobServlet</servlet-class>-->
<!--</servlet>-->
<!--<servlet-mapping>-->
    <!--<servlet-name>update-job</servlet-name>-->
    <!--<url-pattern>/update-job</url-pattern>-->
<!--</servlet-mapping>-->

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<listener>
    <listener-class>com.company.BatchContextListener</listener-class>
</listener>
</web-app>

上下文监听器:

public class BatchContextListener extends com.google.inject.servlet.GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new BatchModule());
    }
}

和模块:

public class BatchModule extends ServletModule {
    @Override
    protected void configureServlets() {
        serve("/update-job").with(UpdateJobServlet.class);
    }
}
4

2 回答 2

2

首先阅读有关在开发服务器上路由请求的信息。确保您的模块已启动并响应这些网址。然后确保任务队列被路由到正确的模块。

或者:在而不是标题中使用target指令。queues.xmlHost我相信这是一种更清洁的方法,因为您不会因路由细节而污染源代码。

于 2014-09-24T07:19:47.940 回答
2

自 2013 年 8 月 19 日以来,后端(现在的模块)不支持过滤器是一个已知问题。请在此处投票,https://code.google.com/p/googleappengine/issues/detail?id=9859

于 2014-10-07T00:30:04.017 回答