Перезапуск потоковой передачи с 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)
уменьшает вывод, производимый каждую секунду, так что для заполнения буфера требуется гораздо больше времени.