Java Grizzly http服务器导致某些请求失败
我创建了一个grizzly web服务器,用tomcat运行jersey应用程序,以加快测试速度 我是一个grizzly的初学者,但通过查看网络,我将一些代码行放在一起,使grizzly web服务器在不到一个工作日的时间内启动并运行:) 不幸的是,我的类在并发请求上遇到了一些问题,经常有一个或多个并发请求在无法解释的NullPointerException中失败 问题通常出现在我刷新网页时,grizzly必须返回大约25个非缓存文件。这是注册的例外:Java Grizzly http服务器导致某些请求失败,java,jersey,grizzly,Java,Jersey,Grizzly,我创建了一个grizzly web服务器,用tomcat运行jersey应用程序,以加快测试速度 我是一个grizzly的初学者,但通过查看网络,我将一些代码行放在一起,使grizzly web服务器在不到一个工作日的时间内启动并运行:) 不幸的是,我的类在并发请求上遇到了一些问题,经常有一个或多个并发请求在无法解释的NullPointerException中失败 问题通常出现在我刷新网页时,grizzly必须返回大约25个非缓存文件。这是注册的例外: 9-set-2010 10.45.21 c
9-set-2010 10.45.21 com.sun.grizzly.http.servlet.ServletAdapter doService
GRAVE: service exception:
java.lang.NullPointerException
at com.sun.grizzly.http.servlet.FilterChainImpl.doFilter(FilterChainImpl.java:178)
at com.sun.grizzly.http.servlet.FilterChainImpl.invokeFilterChain(FilterChainImpl.java:139)
at com.sun.grizzly.http.servlet.ServletAdapter.doService(ServletAdapter.java:376)
at com.sun.grizzly.http.servlet.ServletAdapter.service(ServletAdapter.java:324)
.....
静态文件由我的一个类提供,但日志告诉我一切正常,当我在tomcat下使用应用程序时,一切正常。
我真的不知道如何解决这个问题
这是我从internet创建/复制的用于启动项目的代码:
public class LaunchApp {
/** Find in internet, used to use argument port as default, only if there is no JERSEY_HTTP_PORT env port enabled*/
private static int getPort(int defaultPort) {
String port = System.getenv("JERSEY_HTTP_PORT");
if (null != port) {
try {
return Integer.parseInt(port);
} catch (NumberFormatException e) {
}
}
return defaultPort;
}
private static URI getBaseURI() {
return UriBuilder.fromUri("http://localhost/").port(getPort(8080)).build();
}
public static final URI BASE_URI = getBaseURI();
protected static GrizzlyWebServer startServer() throws IOException {
final String rootFolder = "/Users/davide/dev/my-project/src/main/webapp";
GrizzlyWebServer ws = new GrizzlyWebServer("/Users/davide/dev/my-project/src/main/webapp");
try{
ServletAdapter adapter = new ServletAdapter();
adapter.addContextParameter( "contextConfigLocation","classpath:applicationContext.xml" );
adapter.addServletListener("org.springframework.web.context.ContextLoaderListener");
adapter.addServletListener("org.springframework.web.context.request.RequestContextListener");
adapter.addInitParameter( "com.sun.jersey.config.property.packages", "it.treis.zero.web.rest");
adapter.addInitParameter( "com.sun.jersey.spi.container.ContainerRequestFilters","com.sun.jersey.api.container.filter.LoggingFilter");
adapter.addInitParameter( "com.sun.jersey.spi.container.ContainerResponseFilters","com.sun.jersey.api.container.filter.LoggingFilter");
adapter.setProperty( "load-on-startup", 1 );
adapter.setServletInstance( new SpringServlet() );
adapter.setRootFolder(rootFolder);
// Add Open Session In View Hibernate Filter.
adapter.addFilter(new org.springframework.orm.hibernate3.support.OpenSessionInViewFilter(), "openSessionInViewFilter", null);
ws.addGrizzlyAdapter(adapter);
ws.start();
} catch(IOException ex){
ex.printStackTrace();
}
return ws;
}
public static void main(String[] args) throws IOException {
System.out.println("Starting Jersey");
GrizzlyWebServer ws = startServer();
System.out.println("Jersey rightly started, press any key to shutdown");
System.in.read();
ws.stop();
System.exit(0);
}
}
如有任何建议,我们将不胜感激
Ciao,Davide.这是由于Grizzly中的一个bug,FilterChainImpl的实现不是线程安全的。此问题已在此处报告:,并在几个月前得到修复 更新到最新版本(1.9.21)为我解决了这个问题。您已经
adapter.addInitParameter( "com.sun.jersey.spi.container.ContainerRequestFilters","com.sun.jersey.api.container.filter.LoggingFilter");
adapter.addInitParameter( "com.sun.jersey.spi.container.ContainerResponseFilters","com.sun.jersey.api.container.filter.LoggingFilter");
供参考的配置中有两次..不确定这是否是一个问题
在上面的错误通知单中表示。如果注册了多个筛选器,则会发生以下情况:
“我建议至少让这个变量线程安全。
这个问题只显示注册了多个过滤器。”我改变了一些东西,试图解决这个问题,我更新了一些关于grizzly deployer的内容,我正试图用这个伟大的产品解决这个问题。GrizzlyWebServerDeployer gws=新的GrizzlyWebServerDeployer();DeployerConfiguration conf=新的DeployerConfiguration();conf.cometEnabled=false;conf.forcedContext=“/java zero”;conf.locations=“./target/java zero/”;尝试{//ready to launch gws.launch(conf);}catch(Exception e){e.printStackTrace();}不幸的是,应用程序无法启动,但日志告诉我jersey找不到资源…嗨,我无法测试它是否正在运行。。。当我启动服务时,部署转到无限循环并继续部署相同的应用程序。。。这太棒了:)看起来这也可以通过删除注册的过滤器来修复