2010-09-09 7 views
1

J'ai créé un serveur web Grizzly, pour lancer mon application jersey sur Tomcat, afin d'accélérer les tests.Le serveur http Grizzly échoue à une requête

Je suis un débutant grizzly, mais en regardant à travers le filet, je mis quelques lignes de code ensemble, pour faire un serveur web grizzly et en cours d'exécution en moins d'un jour de travail :)

Malheureusement ma classe a quelques problèmes En cas de requête simultanée, un ou plusieurs échouent souvent dans un inexplicable NullPointerException.

Les problèmes surviennent généralement lorsque j'actualise ma page Web, où grizzly doit renvoyer environ 25 fichiers non mis en cache. Ceci est exception recommandée:

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) 
..... 

fichiers statiques sont servis d'une classe de la mienne, mais les journaux me dit everithing est ok et quand j'utilise l'application sous tomcat, tout est ok. Je ne sais vraiment pas comment résoudre ce problème ..

Voici le code que j'ai créé/copié à partir d'Internet, au démarrage du projet:

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

Toutes les suggestions sont appréciés.

Ciao, Davide.

+0

J'ai changé quelque chose, en essayant de résoudre le problème, j'ai quelque chose à propos de grizzly déployer et j'essaye de résoudre avec ce produit génial. \t \t \t \t GrizzlyWebServerDeployer gws = nouveau GrizzlyWebServerDeployer(); \t \t \t DeployerConfiguration conf = new DeployerConfiguration(); \t conf.cometEnabled = false; \t conf.forcedContext = "/ java-zero"; \t conf.locations = "./ target/java-zero /"; \t \t try { \t \t \t \t // prêt à lancer \t \t gws.lancement (conf); Catch (Exception e) { \t \t e.printStackTrace(); Malheureusement, l'application semble commencer, mais les journaux m'indiquent que le maillot ne peut pas trouver de ressources ... – Davide

Répondre

0

Ceci est dû à un bug dans Grizzly, l'implémentation de FilterChainImpl n'est pas threadsafe. Le problème a été signalé ici: https://grizzly.dev.java.net/issues/show_bug.cgi?id=819, et a été corrigé il y a quelques mois.

La mise à jour à la dernière version (1.9.21) a résolu le problème pour moi.

+0

Salut, je ne peux pas tester si elle est en cours d'exécution ... Quand je démarre le service, déployer aller à un infini boucle et continuer à déployer la même application ... C'est fantastique :) – Davide

+0

J'étudie si ce problème dépend de la façon dont je déclare mon web-xml ... – Davide

0

vous avez

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

deux fois dans votre configuration FYI..not que si cela pourrait être un problème.

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

DÉCLARE erreur ci-dessus ticket..if vous enregistrer plus d'un filtre cela se produit. « Je propose au moins de faire cette threadsafe variables Le problème montre que si plus de filtre est enregistré. "

+0

Egalement ressemble à ceci peut être résolu en supprimant un filtre enregistré –

Questions connexes