使用SOAPHandler时MTOM无法正常工作

时间:2012-08-17 08:47:42

标签: java out-of-memory mtom soaphandler

我尝试使用Mtom传输文件,并且在我使用SoapHandler验证客户端签名之前它工作得很好。 SoapHandler保留所有消息并将其更改为base64编码。因此,当我尝试获取大文件时,Jvm会抛出堆大小异常。你们知道解决这个问题的方法吗?

1 个答案:

答案 0 :(得分:2)

Java JRE附带了一个JAX-WS Provider。这个提供程序有我认为的bug。如果通过直接获取HandlerChain或使用HandlerResolver添加SoapHandler,则会解构使用MTOM正确创建的消息,并且附件将内联放置在SOAP消息中。如果附件很大,则可能导致性能极差或内存不足错误。

我找到的唯一解决方案是使用另一个JAX-WS提供程序。从测试来看,Axis2似乎运行得很好(虽然它有很多依赖项)。只需在类路径上放置另一个提供程序就可以使用它。 Java在名为javax.xml.ws.spi.Provider的META-INF / services中查找文件。如果找到此文件,它将使用指定的提供程序。主Axis2 jar将包含此文件以确保使用Axis2提供程序。其他提供商也可以解决这个问题。

由于此自动提供程序检测,您可能会发现您的应用程序根据其运行位置确实存在或不存在此问题。例如,如果将应用程序部署到IBM WebSphere,它已经覆盖了默认的Provider,您将不会遇到此问题。可能其他应用程序服务器也覆盖了默认的提供程序。如果您可以获得副本,IBM还提供了一个非常好的jar,com.ibm.jaxws.thinclient_7.0.0.jar,其中包含了Axis2。这只能用于独立应用程序(那些没有在WebSphere中运行的应用程序),但它非常方便并且可以解决这个问题。