1

这个例子是基于书中的一个例子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()这样做?将流数据延迟引入客户端的好方法是什么?

4

2 回答 2

2

您应该尝试使用 Jetty 连接器而不是内部 Restlet 连接器。尽管我们正在努力修复它,但该连接器尚未准备好投入生产。

你也可以试试 Simple 扩展,它的依赖 JAR 比 Jetty 扩展少。

于 2013-04-30T12:56:11.220 回答
1

您可以尝试刷新缓冲区,如下所示:

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

于 2013-04-21T16:41:45.557 回答