1

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

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

我的理论解决方案是将这些“附件”从一端流式传输到另一端(文件从网络应用程序上传,然后转换为 base64 并调用网络服务以存储在某些 Adob​​e 应用程序中) - 我说效率非常低

我阅读了有关 Stax 的信息,但这不适用于 WebServices。

有没有办法将流媒体与 Webservices 结合使用?

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

4

1 回答 1

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

于 2012-07-19T20:43:09.127 回答