English 中文(简体)
通过网络服务下载大宗档案
原标题:Downloading large files via web service in Java
  • 时间:2009-11-02 19:25:11
  •  标签:

我有一个网上申请,在那里有一个档案存放处。 这一网络应用提供网络服务,使客户能够通过SOAP搜索储存库并下载任何附件。

目前,我曾尝试使用MTOM的P Spring-WS 1.5.8向客户发出附件,但我却不忘记忆错误。 我并不认为这些错误与我的Tomcat 6 事件有关,因为我的服务器有8GB的记忆,我配置了Tomcat,使用4GB。 我正在把这些错误作为小数200德国马克。

我需要使用SOAP,尽管它很可能不是最佳办法。 我倾向于在春天解决问题,但如果不可能这样做,我会接受其他想法。 我读到,人们可以使用AxiomSoapMessageFactory,将档案输入服务器,以便上载,但不是其他方式。 情况如何? 我正在使用 Java6。

这里,我一直处在“春天世界展望”框架内:

java.lang.OutOfMemoryError: Java heap space
    com.sun.xml.internal.messaging.saaj.util.ByteOutputStream.ensureCapacity(Unknown Source)
    com.sun.xml.internal.messaging.saaj.util.ByteOutputStream.write(Unknown Source)
    com.sun.xml.internal.messaging.saaj.packaging.mime.internet.BMMimeMultipart.find(Unknown Source)
    com.sun.xml.internal.messaging.saaj.packaging.mime.internet.BMMimeMultipart.readBody(Unknown Source)
    com.sun.xml.internal.messaging.saaj.packaging.mime.internet.BMMimeMultipart.getNextPart(Unknown Source)
    com.sun.xml.internal.messaging.saaj.packaging.mime.internet.BMMimeMultipart.parse(Unknown Source)
    com.sun.xml.internal.messaging.saaj.packaging.mime.internet.BMMimeMultipart.parse(Unknown Source)
    com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeMultipart.getCount(Unknown Source)
    com.sun.xml.internal.messaging.saaj.soap.MessageImpl.initializeAllAttachments(Unknown Source)
    com.sun.xml.internal.messaging.saaj.soap.MessageImpl.getAttachments(Unknown Source)
    org.springframework.ws.soap.saaj.Saaj13Implementation.getAttachment(Saaj13Implementation.java:305)
    org.springframework.ws.soap.saaj.SaajSoapMessage.getAttachment(SaajSoapMessage.java:226)
    org.springframework.ws.support.MarshallingUtils$MimeMessageContainer.getAttachment(MarshallingUtils.java:109)
    org.springframework.oxm.jaxb.Jaxb2Marshaller$Jaxb2AttachmentUnmarshaller.getAttachmentAsDataHandler(Jaxb2Marshaller.java:532)
    com.sun.xml.internal.bind.v2.runtime.unmarshaller.MTOMDecorator.startElement(Unknown Source)
    com.sun.xml.internal.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(Unknown Source)
    com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(Unknown Source)
    com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(Unknown Source)
    com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(Unknown Source)
    com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(Unknown Source)
    com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(Unknown Source)
    com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(Unknown Source)
    com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(Unknown Source)
    com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(Unknown Source)
    com.sun.xml.internal.bind.unmarshaller.DOMScanner.scan(Unknown Source)
    com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(Unknown Source)
    com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(Unknown Source)
    javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
    org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:421)
    org.springframework.ws.support.MarshallingUtils.unmarshal(MarshallingUtils.java:62)
    org.springframework.ws.client.core.WebServiceTemplate$3.extractData(WebServiceTemplate.java:374)
    org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:560)
最佳回答

It could have something to do with your eden space being to small. The eden space is the part of the heap where new object are allocated and remain until they have survived a GC. The eden space is by not very big. (i don t have a default value but on default setup with 1GB heap it is only 64MB)

你的档案可能装在登天空。 没有一个200个甲基溴免费空间,或者将沥青阵列分配给小型和需要增长。 Java一个阵列的唯一途径是分配一个更大的新阵列,并做一个透镜。 这将从100德国元增长到200德国元,这显然需要300甲基溴的肥皂总面积。

您可尝试制定<代码>-XX:NewSize=4196M,分配4GB eden heap空间。

我必须指出,我不知道的“i Tomcat”在某些服务器模式中运行,它使用的是一种传播的GC/跃式战略。

可在jvmstat 3.0(而不是与Java 5和6交织的配方)上监测蒸汽的大小。

http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html” rel=“nofollow noreferer”

如果你解决这个问题,你将面临业绩不佳的问题,这是一个无法衡量的解决办法。 或许可以通过某种直接递解来改进你。 为此,必须努力执行一个简单的工具。

问题回答

Java的SOAP/XML一直保持大量管理,需要大量记忆。 在这种具体情况下,它试图为一种(大的)旁观拨款,而不是直接向另一种类型的产出Stream(任何一种情况,但BatteArrayOutputStream)书写。

你们是否认为只是忘记了SOAP的交接点,而是回到了使用java.net的基础。 URLConnection and Building on this further? 这样,你就可以直接把InputStream写到使用FileOutputStream的磁盘上,这比把整个东西储存起来更为有效。

看像你那样,正在处理完整的档案,而不是阅读,因为它被送给客户。

如果你创立一个能够寄送和留给它的实际档案的URL?





相关问题
热门标签