Question

J'évaluation Apache CXF pour un projet si j'ai écrit une petite application de démo pour essayer quelques choses. Suite à la guide de l'utilisateur CXF, j'ai pu obtenir ma demande et en cours d'exécution assez rapidement.

Une chose que je voulais tester était à quel point CXF est capable de gérer une méthode qui retourne un large éventail de primitives. Donc, je défini une méthode « float[] getRandFloats(int count) » qui renvoie simplement un tableau de la longueur spécifiée rempli de nombres aléatoires. En regardant le WSDL généré par java2wsdl, je vois la méthode indique correctement un type de retour de float[]. Inspectant le côté client, je vois aussi que je suis (en fin de compte) recevant un float[].

J'ai remarqué que j'augmente le nombre d'éléments dans mon tableau, les performances du client souffre. Je courais un profileur sur le côté client et vu qu'il ya des objets Float créés pour chaque élément du tableau retourné. Il semble que cela se produit lorsque CXF invoque JAXB lors de l'analyse de la réponse.

J'évaluation CXF pour une utilisation avec une application qui envoie potentiellement de millions d'nombres à virgule flottante donc cette création d'objets est hautement indésirable. Pour utiliser CXF, je dois trouver un moyen d'empêcher cette création d'objets de se produire. J'ai scruté à travers la documentation et la liste de diffusion, mais qui ne sont pas un moyen de contourner cela.

Quelqu'un at-il rencontré un problème similaire en utilisant CXF? Si oui, comment avez-vous travaillé autour de cette?

Était-ce utile?

La solution

Ceci est certainement pas quelque chose CXF peut rien faire. Plus d'un problème de JAXB. Je crois qu'en interne, gère JAXB tous les cas « maxOccurs! = 1 » comme une collection java, pas un tableau. Il convertit juste le tableau comme la dernière étape du processus si elle a besoin. Depuis collections Java ne peuvent pas contenir des primitives, il serait Float des objets stockés.

Dans anycase, cela devrait être pris avec les gens JAXB. : - (

Autres conseils

Vous dites que la performance cliernt souffre comme des éléments umber l'augmentation du tableau. Cela me semble raisonnable - plus de données, moins les performances. Que pensiez-vous là-bas? Tant que c'est un degredation linéaire, il se comporte bien.

En ce qui concerne la création de millions d'objets, une machine virtuelle Java moderne fera cela sans casser la sueur. Je soupçonne que les concepteurs de CXF sont bien conscients. Old JVMs avait des algorithmes pauvres de GC, et ayant des millions d'objets autour de coups de pieds ne fait poser un problème, mais ce n'est plus le cas, en particulier avec des objets très courte durée comme vous avez ici.

d'une part, nous avons une dégradation des performances provoquée par beaucoup de données, et le fait que des millions d'objets sont créés. Cependant, il n'y a aucune preuve que les deux observations sont liées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top