我在应用程序中有两个模块。第一个模块正在通过推送队列为第二个模块生成任务。两个模块都使用手动缩放。
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);
}
}