Java 使用Thread.sleep()的Restlet流
此示例基于《Restlet in Action一书中的一个示例 如果我尝试Java 使用Thread.sleep()的Restlet流,java,streaming,restlet,Java,Streaming,Restlet,此示例基于《Restlet in Action一书中的一个示例 如果我尝试 public class StreamResource extends ServerResource { @Get public Representation getStream() throws ResourceException, IOException { Representation representation = new WriterRepresentation(Med
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()
会这样做吗?向客户端引入流数据延迟的好方法是什么?您可以尝试使用缓冲区,如下所示:
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)
减少每秒产生的输出,因此需要更多的时间来填充缓冲区。您应该尝试使用Jetty连接器,而不是内部Restlet连接器。尽管我们正在修复此连接器,但它尚未准备好投入生产
您也可以尝试简单扩展,它的JAR依赖性比Jetty扩展小。延迟流式传输确实不是一个好主意,因为这可能会让HTTP连接在这段时间保持打开状态。相反,在从服务器获取下一个json文本之前,您可能会在客户端延迟。可能不会,但我正在尝试避免客户端手动轮询。您在代码中使用while(true),它会一直迭代,直到应用程序崩溃为止。@我试图设置一些条件,以便在客户端断开连接时终止循环。您检查了吗?谢谢你的回复。我在修修补补的时候确实试过调用
flush()
,但没有什么不同。我查了一下[表示法#write())[该WriterRepresentation必须重写,它声明实现此方法的类在写入后不应刷新或关闭给定的Writer,因为这将由Restlet连接器自动处理,并且认为这就是它不工作的原因。嗯……我仍然不确定。连接器可以刷新并关闭w只有当WriterRepresentation.write()
方法返回时才写入。而您的无限循环阻止了这一点。因此writer.flush()
应该可以工作。您可以尝试使用Jetty连接器而不是内部Restlet连接器吗?这会有区别吗?@JeromeLouvel,另一方面,如果我尝试只使用Jetty(无Restlet),它按预期工作。我有很多restlet代码库,所以我正在尝试让它与restlet的ServerResource一起工作。任何帮助都将不胜感激!Thanks@JeromeLouvel我收回前面提到的内容。它使用Jetty连接器与我的ServletResource一起工作。这是restlet连接器的一个限制吗?我可以用你不需要依赖jetty吗?我很高兴在坚持了一个星期后,我今天能看到它工作。谢谢。如果你能将你的上述评论转化为对的回答,我会给你大部分的赏金。