求助:Cxf 采用MTOM 上传100M以上的文件时,如何处理

62 views
Skip to first unread message

weblog2007

unread,
Aug 19, 2008, 11:59:30 PM8/19/08
to cxf-zh
求助:Cxf 采用MTOM 上传100M以上的文件时,如何处理

weblog2007

unread,
Aug 20, 2008, 12:01:37 AM8/20/08
to cxf-zh
另:有没有缓存机制处理大容量的附件文件?
如有,如何设置?

Freeman Fang

unread,
Aug 20, 2008, 1:53:38 AM8/20/08
to cxf...@googlegroups.com
yes,缓存是cxf缺省帮你实现的,当附件大于一定的size会帮你在硬盘上存成临时文件
缺省的size是64k(IIRC),可以设置这个缺省值

Freeman

weblog2007 wrote:
> 另:有没有缓存机制处理大容量的附件文件?
> 如有,如何设置?
> >
>

weblog2007

unread,
Aug 20, 2008, 2:26:17 AM8/20/08
to cxf-zh
能说的仔细点吗?是否需要设置存放临时文件的路径?如何设置?
谢谢

Freeman Fang

unread,
Aug 20, 2008, 2:33:16 AM8/20/08
to cxf...@googlegroups.com
临时文件会放到 system property定义的
java.io.tmpdir (unix系统和windows系统都有自己缺省的目录)中, 你可以通过设
置这个系统属性的方式更改目录,
也可以通过cxf自己定义的系统属性
org.apache.cxf.io.CachedOutputStream.OutputDirectory定义临时文件目录
这些临时文件是deleteOnExit的,就是进程结束会被删除
更详细的关于cxf中如何实现message缓存(mtom附件也是message的一部分)的机制,
看一下[1]
关于cxf中mtom相关使用,看一下[2][3]

[1]http://svn.apache.org/repos/asf/cxf/trunk/api/src/main/java/org/apache/cxf/io/CachedOutputStream.java
[2]http://cwiki.apache.org/CXF20DOC/mtom.html
[3]http://cwiki.apache.org/CXF20DOC/mtom-attachments.html

Freeman

weblog2007 wrote:
> 能说的仔细点吗?是否需要设置存放临时文件的路径?如何设置?
> 谢谢
>
>
> >
>

weblog2007

unread,
Aug 20, 2008, 3:26:01 AM8/20/08
to cxf-zh
我的服务端的配置文件已经做了如下设置:
<jaxws:properties>
<entry key="mtom-enabled" value="true"/>
</jaxws:properties>
服务端代码:
public String sendDh(@XmlMimeType("application/octet-stream")
DataHandler handler) throws Exception {
handler.writeTo(new FileOutputStream(new File("c://
sendCxfTest.zip")));
return "success";
}

客户端调用:
SOAPConnectionFactory soapConnFactory =
SOAPConnectionFactory.newInstance();
SOAPConnection connection = soapConnFactory.createConnection();
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage message = messageFactory.createMessage();
SOAPPart soapPart = message.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
SOAPBody body = envelope.getBody();
SOAPElement bodyElement = body.addChildElement(envelope.createName(
"sendDh", "ns2","http://webservice.com/"));
SOAPElement subElement = bodyElement.addChildElement("arg0");
SOAPElement xope
=subElement.addChildElement(envelope.createName("Include",
"xop","http://www.w3.org/2004/08/xop/include"));
xope.addAttribute(envelope.createName("href"),"cid:
42a7ee0a-20ee-426b-a135-094d72bc138f");
// Save the message
DataHandler dataHandler = new DataHandler(new FileDataSource(new
File("C://text_templatea.zip")));
AttachmentPart attachment =
message.createAttachmentPart(dataHandler);
attachment.setContentId("<42a7ee0a-20ee-426b-a135-094d72bc138f>");
message.addAttachmentPart(attachment);
String destination = "http://192.168.0.110:8080/Service";
// Send the message
SOAPMessage reply = connection.call(message, destination);

客户端调用时报错(文件100M以上,小文件没问题):
2008-8-20 15:14:01 com.sun.xml.messaging.saaj.soap.MessageImpl
saveChanges
严重: SAAJ0540: Error during saving a multipart message
Exception in thread "main"
com.sun.xml.messaging.saaj.SOAPExceptionImpl:
java.security.PrivilegedActionException:
com.sun.xml.messaging.saaj.SOAPExceptionImpl: Error during saving a
multipart message
at
com.sun.xml.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:
146)
at com.dataexchange.webservice.domain.SendDhTest.main(SendDhTest.java:
49)
Caused by: java.security.PrivilegedActionException:
com.sun.xml.messaging.saaj.SOAPExceptionImpl: Error during saving a
multipart message
at java.security.AccessController.doPrivileged(Native Method)
at
com.sun.xml.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:
140)
... 1 more
Caused by: com.sun.xml.messaging.saaj.SOAPExceptionImpl: Error during
saving a multipart message
at
com.sun.xml.messaging.saaj.soap.MessageImpl.saveChanges(MessageImpl.java:
1126)
at
com.sun.xml.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:
261)
at com.sun.xml.messaging.saaj.client.p2p.HttpSOAPConnection
$PriviledgedPost.run(HttpSOAPConnection.java:169)
... 3 more
Caused by: java.lang.OutOfMemoryError: Java heap space

CAUSE:

java.security.PrivilegedActionException:
com.sun.xml.messaging.saaj.SOAPExceptionImpl: Error during saving a
multipart message
at java.security.AccessController.doPrivileged(Native Method)
at
com.sun.xml.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:
140)
at com.dataexchange.webservice.domain.SendDhTest.main(SendDhTest.java:
49)
Caused by: com.sun.xml.messaging.saaj.SOAPExceptionImpl: Error during
saving a multipart message
at
com.sun.xml.messaging.saaj.soap.MessageImpl.saveChanges(MessageImpl.java:
1126)
at
com.sun.xml.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:
261)
at com.sun.xml.messaging.saaj.client.p2p.HttpSOAPConnection
$PriviledgedPost.run(HttpSOAPConnection.java:169)
... 3 more
Caused by: java.lang.OutOfMemoryError: Java heap space

Freeman Fang

unread,
Aug 20, 2008, 3:43:00 AM8/20/08
to cxf...@googlegroups.com
错出在客户端, 你的客户端用的是cxf么?

weblog2007

unread,
Aug 20, 2008, 4:42:22 AM8/20/08
to cxf-zh


上面有代码,用的saaj1.3

Freeman Fang

unread,
Aug 20, 2008, 6:42:40 AM8/20/08
to cxf...@googlegroups.com
是啊
那你就不是采用cxf mtom来上传大文件了,所以你问的cxf中是怎么处理大文件对你
没有帮助啊, 你要用cxf client才能利用到cxf提供的缓存这个feature

Freeman

weblog2007 wrote:
> 上面有代码,用的saaj1.3
> >
>

weblog2007

unread,
Aug 20, 2008, 10:16:20 PM8/20/08
to cxf-zh
我没说明白,我的web服务采用的cxf项目 ,客户端调用的时候时对于大文件,只能用cxf client吗?
如果用cxf client 必须设置ServiceCLass,而客户调用的时候没ServiceClass code就不能用了,所以采用了
saaj 不知还有什么方法对于大文件适合?

Freeman Fang

unread,
Aug 20, 2008, 10:24:50 PM8/20/08
to cxf...@googlegroups.com

weblog2007 wrote:
> 我没说明白,我的web服务采用的cxf项目 ,客户端调用的时候时对于大文件,只能用cxf client吗?
>

那你的问题就不是"Cxf 采用MTOM 上传100M以上的文件时,如何处理"了 :-)

cxf对于大文件有很好的缓存处理,你也看到了你用saaj传大文件会有问题,


> 如果用cxf client 必须设置ServiceCLass,而客户调用的时候没ServiceClass code就不能用了,所以采用了
> saaj 不知还有什么方法对于大文件适合?
>

我们还是推荐你使用cxf的client端,
实际上cxf客户端可以使用dispatch让你直接对message进行操作,和你现在的saaj
的code很像的, 你看一下kit 中的jaxws_dispatch_provider这个sample

另外,你的接口没有wsdl么? 你最好是用wsdl first的方式来进行自己的项目,这样
不容易出错

Freeman
> >
>

weblog2007

unread,
Aug 20, 2008, 11:11:27 PM8/20/08
to cxf-zh
采用code first方式,wsdl是自动生成的
Reply all
Reply to author
Forward
0 new messages