Java 使用Thread.sleep()的Restlet流

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

此示例基于《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()
会这样做吗?向客户端引入流数据延迟的好方法是什么?

您可以尝试使用缓冲区,如下所示:

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吗?我很高兴在坚持了一个星期后,我今天能看到它工作。谢谢。如果你能将你的上述评论转化为对的回答,我会给你大部分的赏金。