Перезапуск потоковой передачи с Thread.sleep()

Этот пример основан на примере из книги Restlet in Action,

Если я попробую

public class StreamResource extends ServerResource
{
    @Get
    public Representation getStream() throws ResourceException, IOException
    {
        Representation representation = new WriterRepresentation(MediaType.TEXT_PLAIN)
        {
            @Override
            public void write(Writer writer) throws IOException
            {
                String json = "{\"foo\" : \"bar\"}";
                while (true)
                {
                    writer.write(json);
                }
            }
        };

        return representation;
    }
}

это работает, и это непрерывно посылает строку json клиенту.

Если я введу задержку в цикле while, как это

String json = "{\"foo\" : \"bar\"}\r\n";

while (true)
{
    writer.write(json);
    try
    {
        Thread.sleep(250);
    }
    catch (InterruptedException e)
    {} 
}

Я надеялся, что клиент получит данные 4 раза в секунду, НО, кажется, клиент ничего не получает.

Может кто-нибудь объяснить, почему введение Thread.sleep() это что? Что является хорошим способом ввести задержку в потоковой передаче данных клиенту?

2 ответа

Решение

Вы должны попробовать с разъемом Jetty вместо внутреннего разъема Restlet. Этот разъем не готов к производству, хотя мы работаем над его исправлением.

Вы также можете попробовать простое расширение, которое имеет меньше зависимых JAR-файлов, чем расширение Jetty.

Вы можете попробовать очистить буфер, вот так:

String json = "{\"foo\" : \"bar\"}\r\n";

while (true)
{
    writer.write(json);
    writer.flush();  // flush the buffer.
    try
    {
        Thread.sleep(250);
    }
    catch (InterruptedException e)
    {} 
}

Без writer.flush()писатель ожидает заполнения внутреннего буфера перед записью сокета. Thread.sleep(250) уменьшает вывод, производимый каждую секунду, так что для заполнения буфера требуется гораздо больше времени.

Другие вопросы по тегам