2016-04-19 2 views
0

Я пытаюсь отправить временный файл в веб-службу RESTful. Я использую следующую функцию, чтобы сделать это:Javax ClientBuilder post() удаляет файл перед отправкой на веб-службу

private static String nlpFileUpload(String filePath) throws IOException { 
    // Check is file exists 
    File file = new File(filePath); 
    if(!file.isFile()) { 
     throw new FileNotFoundException(); 
    } 

    // Upload file to web service 
    return ClientBuilder.newClient() 
     .target(nlprestURL + "upload") 
     .request() 
     .post(
       Entity.entity(file, MediaType.APPLICATION_OCTET_STREAM) 
     ).readEntity(String.class); 
} 

Проблема заключается в методе .post() файл иногда удаляется с диска и FileNotFound исключение возвращается:

[ERROR] [04/18/2016 19:04:35.945] [application-akka.actor.default-dispatcher-2] [TaskInvocation] java.io.FileNotFoundException: /tmp/multipartBody3655134388737861177asTemporaryFile (No such file or directory) 
javax.ws.rs.ProcessingException: java.io.FileNotFoundException: /tmp/multipartBody3655134388737861177asTemporaryFile (No such file or directory) 
at org.glassfish.jersey.client.internal.HttpUrlConnector.apply(HttpUrlConnector.java:287) 
at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:255) 
at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:684) 
at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:681) 
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:228) 
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:444) 
at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:681) 
at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:437) 
at org.glassfish.jersey.client.JerseyInvocation$Builder.post(JerseyInvocation.java:343) 
at pl.edu.pwr.services.serel.SerelServiceRs.nlpFileUpload(SerelServiceRs.java:97) 
at pl.edu.pwr.services.serel.SerelServiceRs.processFile(SerelServiceRs.java:181) 
at jobs.ProcessDocuments.run(ProcessDocuments.java:54) 
at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:41) 
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393) 
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) 
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) 
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) 
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) 

Caused by: java.io.FileNotFoundException: /tmp/multipartBody3655134388737861177asTemporaryFile (No such file or directory) 
at java.io.FileInputStream.open0(Native Method) 
at java.io.FileInputStream.open(FileInputStream.java:195) 
at java.io.FileInputStream.<init>(FileInputStream.java:138) 
at org.glassfish.jersey.message.internal.FileProvider.writeTo(FileProvider.java:115) 
at org.glassfish.jersey.message.internal.FileProvider.writeTo(FileProvider.java:67) 
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:265) 
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:250) 
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162) 
at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1130) 
at org.glassfish.jersey.client.ClientRequest.writeEntity(ClientRequest.java:502) 
at org.glassfish.jersey.client.internal.HttpUrlConnector._apply(HttpUrlConnector.java:388) 
at org.glassfish.jersey.client.internal.HttpUrlConnector.apply(HttpUrlConnector.java:285) 
... 19 more 

Но это исключение не всегда появляется. Во время отладки я обнаружил, что иногда файл отправляется на службу правильно, но в другое время появляется вышеописанное исключение. Я не знаю, что здесь не так. Служба может читать файлы как MediaType.APPLICATION_OCTET_STREAM, но я думаю, что проблема на стороне клиента. Почему метод .post() удаляет файл перед отправкой его на веб-службу?

Я использую Play Framework 2.3.9 в своем приложении. nlpFileUpload(String filePath) Функция вызывается планировщиком Akka.

ответ

0

Проблема с временными файлами воспроизведения заключается в том, что они удаляются при их сборке мусора. Временные файлы создаются, когда файл загружается клиентом и обрабатывается как MultipartFormData. Возможно, поэтому ваш код иногда работает.

Чтобы решить эту проблему, вы можете попытаться сохранить ссылку на этот файл, чтобы он не был очищен сборщиком мусора. Вы можете начать с изменения определения своей функции, чтобы использовать эту ссылку:

static String nlpFileUpload(File file) throws IOException 
+0

10 Я вызвал сборщик мусора System.gc(), и действительно, мой временный файл был удален. Я решил эту проблему, сохранив содержимое в обычный файл. Все еще не знаю, почему временный файл был удален точно в методе '.post()'. – koralgoll

Смежные вопросы