Pregunta

Estoy evaluando Apache CXF para un proyecto así que escribió una pequeña aplicación de prueba para probar un par de cosas. Siguiendo la guía del usuario CXF, yo era capaz de conseguir mi solicitud en marcha y funcionando con bastante rapidez.

Una cosa que quería probar era lo bien CXF es capaz de manejar un método que devuelve una gran variedad de primitivas. Así que define un método 'float[] getRandFloats(int count)' que simplemente devuelve una matriz de la longitud especificada lleno de números aleatorios. Mirando el WSDL generado por java2wsdl, veo el método indica correctamente un tipo de retorno de float[]. Inspeccionar el lado del cliente, también veo que estoy (en última instancia) que recibe una float[].

Me di cuenta de que puedo aumentar el número de elementos en mi matriz, el rendimiento del cliente sufre. Me encontré con un generador de perfiles en el lado del cliente y vi que hay objetos Float ser creadas para cada elemento en la matriz devuelta. Parece que esto está sucediendo cuando se invoca CXF JAXB durante el análisis de la respuesta.

Estoy evaluando CXF para su uso con una aplicación que envía de vuelta potencialmente millones de números de punto flotante por lo que esta creación de objetos es muy indeseable. Para utilizar CXF, que había necesidad de encontrar una manera de evitar que esto suceda la creación de objetos. He escaneado a través de la lista de documentación y envío por correo, pero no han llegado con una forma de evitar esto.

¿Alguien ha encontrado un problema similar con CXF? Si es así ¿cómo se trabaja alrededor de esto?

¿Fue útil?

Solución

Esto definitivamente no es nada CXF puede hacer nada al respecto. Es más una cuestión de JAXB. Creo que internamente, JAXB se ocupa de todas las "maxOcurrencias! = 1" casos como una colección de Java, no una matriz. Sólo se convierte en la matriz como el último paso del proceso si es necesario. Desde colecciones de Java no puede sostener primitivas, sería flotador objetos almacenados.

En anycase, esto tendría que ser tomado con la gente JAXB. : - (

Otros consejos

Usted dice que el rendimiento cliernt sufre como el ocre de elementos en el array. Esto me suena razonable - más datos, menos rendimiento. ¿Qué esperabas allí? Mientras que es una degradación lineal, que se comporta bien.

En cuanto a la creación de millones de objetos, un moderno JVM hacer esto sin romper el sudor. Sospecho que los diseñadores de CXF son muy conscientes de esto. JVM de edad tuvo pobres algoritmos de GC, y tener millones de objetos dando vueltas, efectivamente causar un problema, pero esto ya no es el caso, sobre todo con objetos de muy corta vida que tienes aquí.

Así que, por un lado, tenemos una degradación del rendimiento causada por la gran cantidad de datos, y el hecho de que se crean millones de objetos. Sin embargo, no hay evidencia de que las dos observaciones están relacionadas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top