【问题标题】:Grizzly http server fails some requestGrizzly http 服务器失败了一些请求
【发布时间】:2010-09-09 08:58:53
【问题描述】:

我创建了一个 grizzly Web 服务器,以在 tomcat 之外运行我的球衣应用程序,以加快测试速度。

我是一个 grizzy 初学者,但是通过网络查看我将一些代码行放在一起,以在不到一个工作日的时间内启动并运行一个 grizzy Web 服务器:)

不幸的是,我的班级在并发请求方面遇到了一些麻烦,通常一个或多个失败,莫名其妙的 NullPointerException

问题通常出现在我刷新网页时,其中 grizzly 必须返回大约 25 个非缓存文件。这是已注册的异常:

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 下使用应用程序时,一切都很好。 我真的不知道如何解决这个问题..

这是我从互联网创建/复制到启动项目的代码:

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,大卫。

【问题讨论】:

  • 我改变了一些东西,试图解决问题,我对 grizzly deployer 做了一些修改,我试图用这个伟大的产品来解决。 GrizzlyWebServerDeployer gws = new GrizzlyWebServerDeployer(); DeployerConfiguration conf = 新的 DeployerConfiguration(); conf.cometEnabled = 假; conf.forcedContext="/java-zero"; conf.locations="./target/java-zero/"; try { // 准备启动 gws.launch(conf); } 捕捉(异常 e){ e.printStackTrace();不幸的是,应用程序接缝开始,但日志告诉我球衣找不到资源......

标签: java jersey grizzly


【解决方案1】:

这是由于 Grizzly 中的一个错误,FilterChainImpl 的实现不是线程安全的。该问题已在此处报告:https://grizzly.dev.java.net/issues/show_bug.cgi?id=819,并在几个月前得到修复。

更新到最新版本 (1.9.21) 为我解决了这个问题。

【讨论】:

  • 嗨,我无法测试它是否正在运行...当我启动服务时,部署进入无限循环并继续部署相同的应用程序...太棒了:)
【解决方案2】:

你有

  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");

您的配置中的两次仅供参考..不确定这是否会成为问题。

https://java.net/jira/browse/GRIZZLY-819

上面的错误提示中说..如果您注册了多个过滤器,则会发生这种情况: “我建议至少让这个变量线程安全。 该问题仅显示是否注册了多个过滤器。”

【讨论】:

  • 看起来这也可以通过删除已注册的过滤器来解决
猜你喜欢
  • 2019-04-08
  • 1970-01-01
  • 2012-09-15
  • 2014-09-13
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多