2012-11-01 1 views
2

Je tente de créer un service JAX-WS qui utilise la liaison de données JAXB d'objets générés à partir du très grand ensemble (900+ classes) de Opentravel Alliance schemas. Je peux déployer avec succès un war (avec web.xml et sun-jaxws.xml) contenant mon service JAX-WS sur différents conteneurs de servlets (Jetty, Tomcat6/7, etc.) aussi longtemps que mon web méthode ne pas référence l'un de mes objets JAXB. Par exemple, cela fonctionne:Pourquoi JAX-WS se bloque-t-il lors du déploiement d'un service utilisant la liaison de données JAXB?

@WebService(serviceName = "OTAService", 
targetNamespace = "http://www.opentravel.org/OTA/2003/05") 
@Addressing 
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) 
public class OTAService { 
    public String sayHello(final String name) { 
     return "Hello " + name + "!"; 
    } 
} 

Cependant, si je change la méthode Web pour utiliser JAXB databinding en ajoutant une annotation @XmlSeeAlso ou en faisant référence aux objets directement, tous les conteneurs de servlets j'ai essayé bloquer indéfiniment (1+ heures), sans erreur, et ne commencent:

@WebService(serviceName = "OTAService", 
targetNamespace = "http://www.opentravel.org/OTA/2003/05") 
@Addressing 
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) 
@XmlSeeAlso({OTAHotelResNotifRQ.class, OTAHotelResNotifRS.class}) 
public class OTAService { 
    @Action(input = "OTA_HotelResNotif") 
    @WebMethod(operationName = "OTA_HotelResNotif", action = "OTA_HotelResNotif") 
    public @WebResult OTAHotelResNotifRQ tokenizeOtaHotelResNotifRq(
    @WebParam(partName = "OTA_HotelResNotifRQ", name = "OTA_HotelResNotifRQ", 
    targetNamespace = "http://www.opentravel.org/OTA/2003/05") 
    final OTAHotelResNotifRQ request) { 
     return request; 
    } 
} 

J'ai vérifié que tous les pots nécessaires, y compris les JAXB et les API JAX-WS et jarres d'exécution, sont présents dans le répertoire/lib de la guerre.

Le fichier jar contenant mes objets JAXB, qui est une dépendance requise pour mon projet JAX-WS, peut être créé et installé dans votre référentiel local en exécutant mvn clean install sur this project.

Mon projet JAX-WS, qui est disponible here, peut être exécuté dans Jetty en appelant mvn clean package jetty:run-war.

Vous remarquerez que Jetty démarre directement si seule la méthode sayHello est présente. Toutefois, si vous décommentez la méthode JAXB, Jetty et tous les autres conteneurs de servlets que j'ai essayés resteront éteints tout en essayant d'instancier le servlet JAX-WS. Quelqu'un peut-il expliquer pourquoi les méthodes web avec liaison de données JAXB empêchent mon déploiement de la guerre? Puisque le comportement de congélation est identique sur une variété de contenants de servlet, je pense qu'il doit y avoir une étape cruciale qui me manque; Cependant, comme aucune erreur n'est signalée et que le démarrage du conteneur se bloque, je ne sais pas comment procéder.

Répondre

3

Il semble que cela était dû au grand nombre d'objets JAXB dans mon projet opentravel. Lorsque j'ai connecté VisualVM au processus de lancement et échantillonné la mémoire, JAXB semblait marcher et précharger/mettre en cache l'ensemble de l'arborescence de l'objet pour une raison quelconque (peut-être pour reconstruire le schéma pour inclusion dans le WSDL?).

Réglage -Dcom.sun.xml.bind.v2.runtime.JAXBContextImpl.fastBoot=true comme décrit dans la réponse à this question et cognant la mémoire avec -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m a jetée pour démarrer rapidement.

Je ne suis pas encore sûr si le rendement de performance d'exécution sera un compromis acceptable.

Questions connexes