Reducir el tiempo necesario para crear el JAXBContext
Cada vez que se inicia una aplicación de servicios web, se realiza una búsqueda del cargador de clases para clases JAXB potenciales. Si el proceso de búsqueda de la aplicación es un proceso largo, puede reducir la cantidad de tiempo que el sistema emplea en la creación del JAXBContext para su aplicación.
- Creación de la lista de paquetes que pueden contener clases JAXB. La lista se crea
en función del contenido de WSDL y las anotaciones. No hay opciones para reducir el tiempo necesario para crear la lista de paquetes. Sin embargo, es importante saber que algunos casos aislados y escenarios de uso exclusivo podrían hacer que un paquete que no contiene clases JAXB se incluyera en la lista de paquetes. A continuación se muestra un ejemplo de un mensaje de rastreo que indica que un se incluye un paquete que no contiene clases JAXB:
Here is an example trace that indicates this situation12/2/11 6:24:40:548 PST] 0000003e JAXBUtils 1 org.apache.axis2.jaxws.message.databinding.JAXBUtils createJAXBContextValue Package com.company.queryall.v1 does not have any JAXB classes. It is removed from the JAXB context path.
Para cada aparición de este mensaje, debe incluir un archivo jaxb.index vacío en el paquete para indicar que no hay clases JAXB. Si no se realiza esta acción, la búsqueda de clases JAXB será un proceso largo.
- Determinación de la firma de JAXBContext.newInstance() que debe iniciarse. Puesto que JAXBContext.newInstance() se puede iniciar con una lista de paquetes o con una lista de clases JAXB, debe decidir qué método utilizar en función de sus objetivos.
- Inicio de JAXBContext.newInstance() que crea el objeto JAXBContext.
Realizar las acciones siguientes puede reducir la cantidad de tiempo necesario para crear el JAXBContext
- Habilite la memoria caché permanente de los resultados de la búsqueda de JAXB. Para habilitar la memoria caché permanente de los resultados de búsqueda
para cada paquete, establezca la propiedad personalizada com.ibm.ws.websvcs.getJAXBContext.cacheClassList.persist de la máquina virtual Java™ (JVM) en true.
Si alguno de los paquetes de JAXBContext no contiene un ObjectFactory o el archivo jaxb.index, el cargador de clases realiza una búsqueda de clases JAXB potenciales para cada paquete. Esta búsqueda puede llevar mucho tiempo si la realiza un cargador de clases grande. Puede utilizar la propiedad personalizada de JVM com.ibm.ws.websvcs.getJAXBContext.cacheClassList.persist para almacenar en memoria caché de forma permanente los resultados de la búsqueda para cada paquete que se busca. Las solicitudes de JAXBContext posteriores utilizan la lista de clases almacenada en la memoria caché en lugar de realizar una nueva búsqueda de esos paquetes.
La memoria caché se elimina cuando se actualiza o desinstala una aplicación. Aunque este enfoque podría no mejorar el rendimiento y sí proporcionar una lista de paquetes, no requiere ningún cambio en la aplicación.
Esta acción se recomienda como un primer paso incluso si tiene la intención de utilizar archivos jaxb.index.
- Proporcione un archivo jaxb.index para cada paquete que no contenga una clase
ObjectFactory. Esta acción permite al sistema evitar completamente la búsqueda de clases JAXB.
Este enfoque sí implica realizar modificaciones de la aplicación para que tenga en cuenta
la adición de los archivos jaxb.index.
La lista de paquetes que contienen clases JAXB se puede utilizar cuando cada paquete contiene una clase ObjectFactory o un archivo jaxb.index que especifica las clases JAXB para el paquete. Cuando se proporciona la lista de clases JAXB en la clase ObjectFactory o un archivo jaxb.index, no es necesario buscar clases JAXB.
El uso de una lista de paquetes proporciona una mejora de rendimiento mayor, pero es posible que deba crear manualmente archivos jaxb.index y cambios en la aplicación. Si decide utilizar este enfoque, puede revisar los registros cronológicos de rastreo de depuración en busca de mensajes does not contain an ObjectFactory (no contiene un objeto ObjectFactory) para determinar cuántos paquetes deben actualizarse.
Se puede utilizar un archivo jaxb.index si desea un rendimiento óptimo y está dispuesto a realizar cambios en la aplicación. La clase ObjectFactory se crea normalmente sólo con la herramienta descendentes (wsimport). Por lo tanto, cualquier paquete desarrollado con la herramienta ascendente wsgen probablemente no contenga ninguna clase ObjectFactory. El archivo jaxb.index se utiliza para identificar las clases JAXB en el paquete y reducir la cantidad de tiempo que se tarda para la creación del contexto. El método JAXBContext.newInstance() acepta archivos jaxb.index del mismo modo que acepta la clase ObjectFactory.
El uso de un archivo jaxb.index requiere la evaluación de todas las instancias en el archivo de rastreo que indiquen que un paquete no contiene una clase ObjectFactory, y la creación del archivo jaxb.index apropiado. Después de buscar en el registro de rastreo los mensajes does not contain an ObjectFactory que indican los paquetes que necesitan el archivo jaxb.index, debe:- Cree un archivo jaxb.index con la lista de clases JAXB. Si el paquete no contiene ninguna de las clases JAXB, se debe colocar un archivo jaxb.index vacío en el paquete.
- Vuelva a ejecutar la operación de rastreo y asegúrese de que no haya ningún mensaje does not contain an ObjectFactory en el archivo de rastreo.
Si una clase JAXB necesaria se omite y no se incluye en el archivo jaxb.index, se producirá un error que indica que la clase es desconocida para JAXBContext y la clase debe añadirse al archivo jaxb.index.
Cada paquete utilizado en un JAXBContext debe tener una clase ObjectFactory o un archivo jaxb.index para impedir la búsqueda de clases JAXB. Esto significa que los archivos de rastreo deben examinarse, y abordarse en caso de que falte una instancia de clase ObjectFactory o un archivo jaxb.index. Si un paquete para el JAXBContext se identifica como que no contiene una clase ObjectFactory o un archivo jaxb.index, se realiza la búsqueda de clases JAXB que requiere mucho tiempo. El formato del archivo jaxb.index se documenta en el Javadoc de Oracle para JAXBContext.newInstance() en http://docs.oracle.com/javaee/5/api/javax/xml/bind/JAXBContext.html.
For transitioning users: En la Versión 7.0, aunque se utilice wsgen para crear las clases generadas, éstas no se conservan. Sin embargo, la especificación JAX-WS 2.2 requiere que se conserven las clases generadas. Por lo tanto, wsgen coloca las clases generadas en el directorio packagename/jaxws. La lista de paquetes de búsqueda incluye ahora packagename/jaxws, que no existe en el archivo EAR. Cuando se produce esta situación, recibirá un mensaje de error similar al mensaje siguiente:
Para solucionar este error, puede:6/21/12 17:07:36:477 CDT] 0000001a JAXBContextTr 1 org.apache.axis2.jaxws.message.databinding.JAXBUtils createJAXBContextValue JAXBContextCreate: Package somepackage.jaxws does not contain an ObjectFactory or package-info class. Searching for JAXB classes
- Crear dos archivos EAR diferentes, uno sin el archivo jaxb.index somepackage.jaxws para su uso con la Versión 7.0, y otro con el archivo jaxb.index somepackage.jaxws para su uso con la versión actual del producto.
- Añadir las clases generadas y el archivo jaxb.index al archivo EAR si desea utilizar un único archivo EAR para ambas versiones del producto. Si utiliza esta opción, también debe incluir el WSDL con las clases generadas.
- Utilizar la memoria caché permanente en lugar de archivos los jaxb.index. Con esta opción JAX-RS aún busca clases JAXB una vez por paquete, pero conserva el resultado por lo que no tiene que buscar de nuevo a menos que la aplicación se actualice.
- Si JAXBContext.newInstance() tarda mucho tiempo en completarse, puede utilizar la
propiedad personalizada de JVM jaxws.JAXBContext.permStoreCostThresholdMsec para crear
una memoria caché de disco duro de objetos JAXBContext que no se pierdan durante la
recogida de basura.
No hay ninguna opción para cambiar o mejorar la creación de la instancia JAXBContext real. El tiempo empleado para crear una instancia del contexto se ve afectado por muchos factores, como el número de clases JAXB, el número de paquetes y el tamaño de la vía de acceso de clases. El JAXBContext creado se conserva en una memoria caché de referencia dinámica. Como resultado, la recogida de basura podría descartar un JAXBContext si la memoria disponible pasa a ser pequeña. La siguiente solicitud que necesite el JAXBContext descartado debe volver a crear el JAXBContext. Aunque este proceso de recreación no es significativo para la mayoría de los JAXBContext, hay excepciones en las que el paso newInstance() tarda una cantidad significativa de tiempo.
Si el JAXBContext de una aplicación tarda mucho tiempo en crear newInstance(), considere la posibilidad de utilizar las siguientes propiedades personalizadas de JVM para colocar el JAXBContext en una memoria caché que se conserve hasta que se reinicie la JVM o la aplicación.
- jaxws.JAXBContext.permStoreCostThresholdMsec
- Establezca esta propiedad en un valor distinto de cero en milisegundos. Los contextos que necesitan más tiempo del especificado se almacenan en memoria caché. El valor recomendado es 5000 o superior. El valor predeterminado es 0. Si esta propiedad se establece en 0, la memoria caché no se utiliza.
- jaxws.JAXBContext.permStoreMaxSize
- Establezca esta propiedad en el número máximo de entradas que desea que se conserven en la memoria caché. El valor predeterminado es 32. Si la memoria caché se llena, el JAXBContext que requiere la menor cantidad de tiempo en crearse se elimina de la caché para dejar espacio a un JAXBContext con un tiempo de creación mayor.
- jaxws.JAXBContext.permStoreStaleThresholdHours
- Establezca esta propiedad en el período de tiempo, en horas, que desea que las entradas permanezcan en la memoria caché. Las entradas de la memoria caché a las que no se ha accedido después del número especificado de horas se eliminan antes de que se añadan nuevas entradas en la memoria caché. El valor predeterminado es de 24 horas.