此示例基于书籍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()
会这样做吗?将流数据延迟引入客户端的好方法是什么?
答案 0 :(得分:2)
您应该尝试使用Jetty连接器而不是内部Restlet连接器。即使我们正在修复它,该连接器还没有准备好生产。
您还可以尝试简单扩展,它具有比Jetty扩展更少的依赖JAR。
答案 1 :(得分:1)
您可以尝试flush缓冲区,如下所示:
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)
减少了每秒产生的输出,因此填充缓冲区需要更多的时间。