通过SOAP流式传输?

时间:2012-07-19 20:26:43

标签: java performance web-services streaming java-metro-framework

我有WS在SOAP有效负载中有一个xsd:base64Binary元素。

最初这个设计最大为1MB,但要求已经改变,现在它应该接受50 MB上传文件转换为base64 :(在java中,这在内存方面变得巨大。

我的理论解决方案是从一端流到另一端这些附件' (文件从Web应用程序上传,然后转换为base64,并调用Web服务存储在某些Adobe应用程序中) - 效率非常低我说

我读到了Stax,但这不适用于WebServices。

有没有办法将流式传输与Webservices结合使用?

(MTOM,但没有找到带流媒体的样本)

1 个答案:

答案 0 :(得分:3)

我认为你可以使用自定义servlet并覆盖post方法。

通过Stax读取足够的请求的InputStream以找到包含base64的元素,然后将其传递给某种Base64InputStream,直到到达元素的末尾。使用Stax或JaxB将对象转换为响应并将其发回。

无论你做什么,都不要缓冲整个请求。不要使用像CXF或JAXWS这样的典型肥皂框架,而不考虑它如何处理缓冲。你要打你的垃圾收集器这么难,它会惊慌失措,逃跑,永远不再打电话给你。

编辑:垃圾收集

如果您正在运行4gb堆,并假设您正在使用HotSpot,请确保您使用的是Oracle最新的Java(7u5)。接下来,切换到一个旨在处理大堆的收集器:g1gc(-XX:+ UseG1GC)或CMS(-XX:+ UseConcMarkSweepGC -XX:+ CMSIncrementalMode)

此外,请考虑添加以下内容:

-XX:+ OptimizeStringConcat -XX:+ AggressiveOpts -XX:+ UseFastAccessorMethods -XX:+ UseLargePages -XX:+ UseStringCache -XX:+ UseCompressedOops

相关问题