2012-06-13 51 views
0

我使用的是netty 3.5.0,我已經實現了上傳示例HttpUploadServer,HttpUploadServerHandler,HttpUploaderServerPipeLineFactorynetty文件上傳內存不足錯誤

HttpUploadServerHandler,有幾個註釋掉線

// fileUpload.isInMemory();// tells if the file is in Memory 
// or on File 
// fileUpload.renameTo(dest); // enable to move into another 
// File dest 
// decoder.removeFileUploadFromClean(fileUpload); //remove 
// the File of to delete file 

當我發表意見,在這些線路,特別是renameTo(dest),我發現它是間歇性故障大型文件傳輸,用了內存下面看到的錯誤。

旁白:removeFileUploadFromClean似乎並沒有解決

誰能告訴我是怎麼回事或者如何解決?

我想能夠傳輸大文件,然後將它們從臨時位置移動到它們的最終目的地。當你不使用renameTo時,轉移到臨時位置似乎是非常好的,但由於我假設的清理,文件很快就被刪除。

HttpUploadServerHandler::messageReceived 
HttpUploadServerHandler::messageReceived 
HttpUploadServerHandler::messageReceived 
HttpUploadServerHandler::messageReceived 
renaming fileoxygen.exe 
fileUpload.getFilename() oxygen.exe 
fileUpload.getName() myfile 
java.io.IOException: Map failed 
at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:748) 
at sun.nio.ch.FileChannelImpl.transferToTrustedChannel(FileChannelImpl.java:437) 
at sun.nio.ch.FileChannelImpl.transferTo(FileChannelImpl.java:510) 
at org.jboss.netty.handler.codec.http.multipart.AbstractDiskHttpData.renameTo(AbstractDiskHttpData.java:292) 
at org.jboss.netty.handler.codec.http.multipart.MixedFileUpload.renameTo(MixedFileUpload.java:117) 
at com.vayyoo.vaf.nettyapp.upload.HttpUploadServerHandler.writeHttpData(HttpUploadServerHandler.java:317) 
at com.vayyoo.vaf.nettyapp.upload.HttpUploadServerHandler.readHttpDataChunkByChunk(HttpUploadServerHandler.java:253) 
at com.vayyoo.vaf.nettyapp.upload.HttpUploadServerHandler.messageReceived(HttpUploadServerHandler.java:208) 
at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:75) 
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:563) 
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791) 
at org.jboss.netty.handler.codec.http.HttpContentEncoder.messageReceived(HttpContentEncoder.java:67) 
at org.jboss.netty.channel.SimpleChannelHandler.handleUpstream(SimpleChannelHandler.java:95) 
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:563) 
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791) 
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296) 
at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:359) 
at org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:568) 
at org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:437) 
at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:75) 
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:563) 
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:558) 
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268) 
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255) 
at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:91) 
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.processSelectedKeys(AbstractNioWorker.java:373) 
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:247) 
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:35) 
at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:102) 
at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:662) 
Caused by: java.lang.OutOfMemoryError: Map failed 
at sun.nio.ch.FileChannelImpl.map0(Native Method) 
at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:745) 
renamed file to c:\temp\oxygen.exe 
HttpUploadServerHandler::messageReceived 
renaming fileoxygen.exe 
fileUpload.getFilename() oxygen.exe 
fileUpload.getName() myfile 
... 32 more 
java.io.IOException: Map failed 
at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:748) 
at sun.nio.ch.FileChannelImpl.transferToTrustedChannel(FileChannelImpl.java:437) 
at sun.nio.ch.FileChannelImpl.transferTo(FileChannelImpl.java:510) 
at org.jboss.netty.handler.codec.http.multipart.AbstractDiskHttpData.renameTo(AbstractDiskHttpData.java:292) 
at org.jboss.netty.handler.codec.http.multipart.MixedFileUpload.renameTo(MixedFileUpload.java:117) 
at com.vayyoo.vaf.nettyapp.upload.HttpUploadServerHandler.writeHttpData(HttpUploadServerHandler.java:317) 
at com.vayyoo.vaf.nettyapp.upload.HttpUploadServerHandler.readHttpDataAllReceive(HttpUploadServerHandler.java:236) 
at com.vayyoo.vaf.nettyapp.upload.HttpUploadServerHandler.messageReceived(HttpUploadServerHandler.java:211) 
at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:75) 
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:563) 
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791) 
at org.jboss.netty.handler.codec.http.HttpContentEncoder.messageReceived(HttpContentEncoder.java:67) 
at org.jboss.netty.channel.SimpleChannelHandler.handleUpstream(SimpleChannelHandler.java:95) 
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:563) 
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791) 
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296) 
at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:359) 
at org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:568) 
at org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:437) 
at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:75) 
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:563) 
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:558) 
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268) 
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255) 
at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:91) 
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.processSelectedKeys(AbstractNioWorker.java:373) 
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:247) 
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:35) 
at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:102) 
at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:662) 
Caused by: java.lang.OutOfMemoryError: Map failed 
at sun.nio.ch.FileChannelImpl.map0(Native Method) 
at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:745) 
... 32 more 
renamed file to c:\temp\oxygen.exe 
HttpUploadServerHandler::messageReceived 

回答

0

對我來說,它看起來像的renameTo()目的地不屬於與臨時文件相同的文件系統。因此,嘗試移動文件失敗,並且renameTo()將文件複製到目標並刪除臨時文件。但是,似乎renameTo()以奇怪的方式實現了文件複製操作。 (即錯誤)。直到錯誤是固定的,你可以:

  1. 指定屬於同一個分區與臨時文件目錄的路徑,或
  2. 獲取臨時文件的路徑,並通過自己實現複製操作。

您可以在這裏追蹤這個問題:https://github.com/netty/netty/issues/398

0

的問題,你現在將被固定在版本3.5.1.Final。