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)
    {} 
}

クライアントが 1 秒間に 4 回データを取得することを期待していましたが、何もクライアントに到達していないようです。

の導入がそれを行う理由を誰か説明できますThread.sleep()か? クライアントへのデータのストリーミングに遅延を導入する良い方法は何ですか?

4

2 に答える 2

2

内部 Restlet コネクタの代わりに Jetty コネクタを試してください。このコネクタは、修正に取り組んでいますが、生産の準備ができていません。

Jetty 拡張機能よりも依存する JAR が少ない Simple 拡張機能を試すこともできます。

于 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)1 秒ごとに生成される出力が減少するため、バッファーをいっぱいにするのにより多くの時間が必要になります。

于 2013-04-21T16:41:45.557 に答える