我正在使用
org.jvnet.mimepull
来允许我的 Java 应用程序提供文件下载服务。一切都很完美,直到我尝试下载> 4GB 的大文件。然后,我得到了java.io.IOException: No space left on device.
的错误
检查服务器,我可以看到 /tmp
文件系统(4GB 大小)完全充满了文件 MIME*.tmp
。据我了解,org.jvnet.mimepull
在下载过程中使用临时目录作为临时目录。
问题是:如何配置
org.jvnet.mimepull
以使用自定义临时目录而不是 /tmp
?
完整的错误堆栈是:
Error handling a request: efd18e645be47f96
java.io.IOException: No space left on device
at java.base/java.io.RandomAccessFile.writeBytes(Native Method)
at java.base/java.io.RandomAccessFile.write(RandomAccessFile.java:559)
at org.jvnet.mimepull.WeakDataFile.writeTo(WeakDataFile.java:122)
at org.jvnet.mimepull.DataFile.writeTo(DataFile.java:95)
at org.jvnet.mimepull.FileData.<init>(FileData.java:57)
at org.jvnet.mimepull.FileData.createNext(FileData.java:91)
at org.jvnet.mimepull.Chunk.createNext(Chunk.java:64)
at org.jvnet.mimepull.DataHead.addBody(DataHead.java:87)
at org.jvnet.mimepull.MIMEPart.addBody(MIMEPart.java:243)
at org.jvnet.mimepull.MIMEMessage.makeProgress(MIMEMessage.java:270)
at org.jvnet.mimepull.MIMEMessage.parseAll(MIMEMessage.java:189)
at org.jvnet.mimepull.MIMEMessage.getAttachments(MIMEMessage.java:115)
at org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide.getMimeParts(MultiPartReaderClientSide.java:272)
at org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide.readMultiPart(MultiPartReaderClientSide.java:231)
at org.glassfish.jersey.media.multipart.internal.MultiPartReaderServerSide.readMultiPart(MultiPartReaderServerSide.java:91)
at org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:183)
at org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:93)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:256)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:235)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155)
at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundReadFrom(MappableExceptionWrapperInterceptor.java:74)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155)
at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1085)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:808)
at org.glassfish.jersey.server.ContainerRequest.readEntity(ContainerRequest.java:234)
at org.glassfish.jersey.media.multipart.internal.FormDataParamValueFactoryProvider$ValueFactory.getEntity(FormDataParamValueFactoryProvider.java:126)
at org.glassfish.jersey.media.multipart.internal.FormDataParamValueFactoryProvider$FormDataParamValueFactory.provide(FormDataParamValueFactoryProvider.java:280)
at org.glassfish.jersey.server.spi.internal.ParamValueFactoryWithSource.provide(ParamValueFactoryWithSource.java:71)
at org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:90)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$AbstractMethodParamInvoker.getParamValues(JavaResourceMethodDispatcherProvider.java:127)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:160)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)
at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
找到了。临时目录的位置由
java.io.tmpdir
系统属性控制。因此,只需添加 JVM 参数即可:
-Djava.io.tmpdir=/path/to/tmpdir