2017-02-04 13 views
-2

Я пытаюсь передать локальные mp3-файлы. Песня, которую я тестирую, длится 5: 33. В обоих хром и край песня играет чуть меньше 4 минут, прежде чем она остановится.StreamingOutput - EofException перед потоком, закончившим запись

Вот моя служба

@Path ("clips") 
public class ClipService { 

    @GET 
    @Path(...) 
    @Produces("audio/mp3") 
    public Response streamAudio() { 

     Clip clip = ... 
     StreamingOutput output = buildStreamingOutput(clip); 
     return Response.ok(output).header(HttpHeaders.CONTENT_LENGTH,   clip.getLength()).build(); 
    } 

    private StreamingOutput buildStreamingOutput(Clip clip) 
     throws Exception { 

     return new StreamingOutput() { 
      @Override 
      public void write(final OutputStream out) 
       throws IOException, WebApplicationException { 

       byte[] buffer = new byte[1024]; 
       int bytesRead; 
       try (InputStream in = clip.getInputStream()) { 
        while ((bytesRead = in.read(buffer)) > 0) { 
         out.write(buffer, 0, bytesRead); 
        } 
        out.flush(); 
       } 
      } 
     }; 
    } 
} 

Класс клип

public class Clip { 

    private InputStream inputStream; // The file 
    private long length; // File.length() 

И ошибка я получаю ...

SEVERE: An I/O error has occurred while writing a response message entity to the container output stream. 
org.glassfish.jersey.server.internal.process.MappableException: org.eclipse.jetty.io.EofException 
    at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:92) 
    ... 
Caused by: org.eclipse.jetty.io.EofException 
    at org.eclipse.jetty.io.ChannelEndPoint.flush(ChannelEndPoint.java:200) 
    ... 
Caused by: java.io.IOException: An established connection was aborted by the software in your host machine 
    at sun.nio.ch.SocketDispatcher.write0(Native Method) 
    at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51) 
    at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) 
    at sun.nio.ch.IOUtil.write(IOUtil.java:51) 
    at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471) 
    at org.eclipse.jetty.io.ChannelEndPoint.flush(ChannelEndPoint.java:178) 
    ... 67 more 

Я попытался установить ServerProperties.OUTBOUND_CONTENT_LENGTH_BUFFER 0 в мой AppConfig безрезультатно.

+0

У вас нет никакой информации о том, кто вас выручил, но посмотрите на трассировку стека. «EofException» был вызван «IOException», поэтому «IOException» является настоящей проблемой здесь, поэтому мое редактирование было правильным и полезным, а редактирование моего редактирования не было. Не делай этого. Я пытаюсь вам помочь. – EJP

+0

Я добавлю для разработчиков Jetty, что при чтении происходит конец файла. Бросать конец файла при записи - это смешно. Было бы лучше вообще не исключать исключение, или даже не поймать его. – EJP

+0

Вам нужно прекратить гадать и начать читать. Я четко изложил как причину, так и мотивацию для моего редактирования, и что было не так с вашим названием. «Недостаток пунктуации» - смехотворная причина отклонить все правки, которые были скопированы/вставлены непосредственно из вашей трассировки стека. Если вы не хотите, чтобы ваш вопрос отвечал людьми, которые могут объяснить базовое «IOException», вы пойдете правильно. Я нарисовал эту войну редактирования вниманию модераторов. – EJP

ответ

0

Вот ответ для тех из вас, кто не хочет быть затруднена некоторыми претенциозным что-нет :)

Оказывается, эти 2 браузеров я протестированные с ручкой content-type=audio/mp3, отменив первоначальный запрос и посылает второй запрос с заголовком диапазона.

Here's another post подробная информация о том, как можно обрабатывать запрос диапазона.