2012-12-20 4 views
2

Apache (Apache 및 Tomcat에서 호스팅)를 사용하여 첨부 파일을 가져 오는 saaj를 사용하고 있습니다. - 첨부 파일 (몇 MB) 큰 경우가큰 첨부 파일을 가져올 때 예외가 발생했습니다.

  • 작동

    • 첨부 파일 (몇 KB) 작은 경우 :

      는 (메시지가 그 SOAPMessage 객체이다) message.getAttachments();를 호출하려고 할 때 내가 SOLV 어떻게

      java.lang.RuntimeException: org.jvnet.mimepull.MIMEParsingException: java.io.IOException: The system cannot find the path specified 
          at com.sun.xml.messaging.saaj.soap.MessageImpl.getAttachments(MessageImpl.java:826) 
          at MyCode.MyServlet.doPost(MyServlet.java:215) 
          at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) 
          at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
          at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
          at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
          at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
          at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
          at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
          at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
          at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
          at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263) 
          at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190) 
          at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283) 
          at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767) 
          at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697) 
          at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889) 
          at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690) 
          at java.lang.Thread.run(Unknown Source) 
      Caused by: org.jvnet.mimepull.MIMEParsingException: java.io.IOException: The system cannot find the path specified 
          at org.jvnet.mimepull.MemoryData.createNext(MemoryData.java:93) 
          at org.jvnet.mimepull.Chunk.createNext(Chunk.java:59) 
          at org.jvnet.mimepull.DataHead.addBody(DataHead.java:82) 
          at org.jvnet.mimepull.MIMEPart.addBody(MIMEPart.java:192) 
          at org.jvnet.mimepull.MIMEMessage.makeProgress(MIMEMessage.java:235) 
          at org.jvnet.mimepull.MIMEMessage.parseAll(MIMEMessage.java:176) 
          at org.jvnet.mimepull.MIMEMessage.getAttachments(MIMEMessage.java:101) 
          at com.sun.xml.messaging.saaj.packaging.mime.internet.MimePullMultipart.parseAll(MimePullMultipart.java:118) 
          at com.sun.xml.messaging.saaj.packaging.mime.internet.MimePullMultipart.parse(MimePullMultipart.java:129) 
          at com.sun.xml.messaging.saaj.packaging.mime.internet.MimeMultipart.getCount(MimeMultipart.java:199) 
          at com.sun.xml.messaging.saaj.soap.MessageImpl.initializeAllAttachments(MessageImpl.java:1384) 
          at com.sun.xml.messaging.saaj.soap.MessageImpl.getAttachments(MessageImpl.java:824) 
          ... 22 more 
      Caused by: java.io.IOException: The system cannot find the path specified 
          at java.io.WinNTFileSystem.createFileExclusively(Native Method) 
          at java.io.File.createTempFile(Unknown Source) 
          at java.io.File.createTempFile(Unknown Source) 
          at org.jvnet.mimepull.MemoryData.createNext(MemoryData.java:87) 
          ... 33 more 
      

    : - 다음과 같은 예외가 발생합니다 이 문제는?

    감사합니다.

    if (!config.isOnlyMemory() && dataHead.inMemory >= config.memoryThreshold) { 
         try { 
          String prefix = config.getTempFilePrefix(); 
          String suffix = config.getTempFileSuffix(); 
          File dir = config.getTempDir(); 
          File tempFile = (dir == null) 
            ? File.createTempFile(prefix, suffix) // here your code crashes 
            : File.createTempFile(prefix, suffix, dir); 
          LOGGER.fine("Created temp file = "+tempFile); 
          dataHead.dataFile = new DataFile(tempFile); 
         } catch(IOException ioe) { 
          throw new MIMEParsingException(ioe); 
         } 
    

    그것은 임시 파일을 열려고 시도, 메모리 크기 임계 값이 전달되기 때문에 :

  • +1

    대용량 파일을 찾을 수없는 경우에 따라 파일이 존재하고 올바른 경로를 사용하고 있습니까? – Veger

    +0

    큰 첨부 파일을 처리하기 위해 구현시 임시 파일을 사용한다고 생각합니다. 나는 그것이 존재하지 않는 위치에 그것을 쓰려고 시도한다고 생각한다. 나는 그것이 어디에 있는지 모른다. 첨부 파일은 그물에서옵니다 (비누 포함) – Matan

    답변

    1

    예외를 생성 MimePull,의 소스 코드는이 말한다.
    는 그것은 당신이 메시지를 수신 할 SAAJ를 사용하고 (-Dsaaj.use.mimepull=true 플래그 사용) MimePull 플러그인을 사용하도록 설정 한 것 같습니다

    at MyCode.MyServlet.doPost(MyServlet.java:215) 
    

    라고합니다. MimePull 구현은 임시 파일을 대체 파일로 사용하기 때문에 더 큰 파일을받을 수 있어야합니다.

    이제 나쁜 소식은 SAAJ 구성을 통해 MimePull 판독기를 구성 할 수 없다는 것입니다. 좋은 소식은 시스템 속성 java.io.tmpdir을 통해 File.createTempFile(...)의 로직을 조정할 수 있다는 것입니다.

    -Djava.io.tmpdir=/path/to/tmpdir으로 시작하십시오.

    어쩌면 직접 메시지를 사용하려고 시도합니다. MimePull 본인은 본 적이 없으므로 나에게 묻지 마십시오. ;-)

    편집 :
    또는 완전히 당신이 첨부 파일의 모든 메모리를 흡수 할 것으로 예상하지 않는 경우 -Dsaaj.use.mimepull=false를 설정하여 MimePull을 전환합니다.

    0

    Jersey-Libs 버전을 1.13에서 1.19로 변경하여이 문제를 해결했습니다. 1.13이 버그가있는 것 같습니다.