Java 如何防止ApacheCXF将Primative转换为对象类型?

Java 如何防止ApacheCXF将Primative转换为对象类型?,java,web-services,cxf,Java,Web Services,Cxf,我正在为一个项目评估ApacheCXF,所以我编写了一个小的演示应用程序来尝试一些东西。按照《CXF用户指南》,我能够很快地启动并运行我的应用程序 我想测试的一件事是CXF处理返回大量原语的方法的能力。因此我定义了一个方法“float[]getRandFloats(int count)”,它只返回一个指定长度的数组,数组中填充了随机数。查看由java2wsdl生成的WSDL,我发现该方法正确地指示了返回类型float[]。检查客户端时,我还看到(最终)接收到一个float[] 我注意到,随着阵列

我正在为一个项目评估ApacheCXF,所以我编写了一个小的演示应用程序来尝试一些东西。按照《CXF用户指南》,我能够很快地启动并运行我的应用程序

我想测试的一件事是CXF处理返回大量原语的方法的能力。因此我定义了一个方法“
float[]getRandFloats(int count)
”,它只返回一个指定长度的数组,数组中填充了随机数。查看由
java2wsdl
生成的WSDL,我发现该方法正确地指示了返回类型
float[]
。检查客户端时,我还看到(最终)接收到一个
float[]

我注意到,随着阵列中元素数量的增加,客户端性能会受到影响。我在客户端运行了一个探查器,看到为返回数组中的每个元素都创建了
Float
对象。当CXF在解析响应期间调用JAXB时,似乎发生了这种情况

我正在评估CXF是否与可能发回数百万个浮点数的应用程序一起使用,因此这种对象创建是非常不可取的。为了使用CXF,我需要找到一种方法来防止这种对象创建的发生。我已经浏览了文档和邮件列表,但还没有找到解决这个问题的方法


是否有人在使用CXF时遇到过类似的问题?如果是这样的话,您是如何解决这个问题的?

您说随着数组中元素数量的增加,cliernt的性能会受到影响。这听起来很合理——数据越多,性能越差。你在那里期待什么?只要它是线性递减,它的行为就正常

至于创建数百万个对象,现代JVM将毫不费力地完成这项工作。我怀疑CXF的设计者对此很清楚。旧JVM的GC算法很差,有数百万个对象四处游荡确实会造成问题,但现在情况已经不是这样了,特别是对于像您这里这样的非常短命的对象


因此,一方面,大量数据和数百万对象的创建导致性能下降。然而,没有证据表明这两个观察结果是相关的

这绝对不是CXF能做的任何事情。这更像是JAXB的问题。我相信在内部,JAXB将所有“maxOccurs!=1”情况作为java集合而不是数组来处理。如果需要的话,它只是在流程的最后一步转换为数组。因为java集合不能保存原语,所以它将被存储为浮点对象


无论如何,这将不得不由JAXB人员来解决-(

我同意JVM有了很大的改进,但是不必要的对象创建仍然不是“免费的”。我至少想排除这是我所观察到的性能下降的原因。有可能CXF不是为这种完全可以接受的用途而设计的。我只是希望在排除它的使用之前,让对CXF有更多了解的人来参与这个话题。它不是免费的,但也不远。JVM将在第一次需要时创建这些新对象,然后根据需要对其进行回收。如果您想排除这一原因,请尝试多次执行该调用,看看每次所用的时间是否相同,或者情况是否有所改善。