使用Thread.sleep()重定向流

时间:2013-04-19 13:22:51

标签: java streaming restlet

此示例基于书籍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 个答案:

答案 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)减少了每秒产生的输出,因此填充缓冲区需要更多的时间。