9

HTTP リクエストInputStreamに応答して返したいデータが無限にあります。GETWeb/API クライアントがそれを際限なく読み取れるようにします。どうすればJAX-RSでそれを行うことができますか? 私はこれを試しています:

@GET
@Path("/stream")
@Produces(MediaType.TEXT_PLAIN)
public StreamingOutput stream() {
    final InputStream input = // get it
    return new StreamingOutput() {
        @Override
        public void write(OutputStream out) throws IOException {
            while (true) {
                out.write(input.read());
                out.flush();
            }
        }
    };
}

しかし、コンテンツはクライアントには表示されません。ただし、 を追加するOutputStream#close()と、サーバーはその瞬間にコンテンツを配信します。本当にストリーミング可能にするにはどうすればよいですか?

4

3 に答える 3

2

したがって、フラッシュの問題がある場合は、仕様にあるように ServletResponse を取得しようとすることができます。

@Context アノテーションを使用して、サーブレット定義のリソースへの依存関係を示すことができます。サーブレットベースの実装は、次のサーブレット定義型の注入をサポートする必要があります: ServletConfig、ServletContext、HttpServletRequest、および HttpServletResponse。

注入された HttpServletResponse により、リソース メソッドは HTTP 応答を返す前にコミットできます。実装は、コミットされたステータスを確認し、応答がまだコミットされていない場合にのみ戻り値を処理する必要があります。

次に、次のように、できる限りすべてをフラッシュします。

@Context
private HttpServletResponse context;

@GET
@Path("/stream")
@Produces(MediaType.TEXT_PLAIN)
public String stream() {
    final InputStream input = // get it
    ServletOutputStream out = context.getOutputStream();
            while (true) {
                out.write(input.read());
                out.flush();
                context.flushBuffer();
            }
    return "";
}
于 2013-06-27T03:39:47.440 に答える
0

ただの推測:

@GET
@Path("/stream")
@Produces(MediaType.TEXT_PLAIN)
public Response stream() {
    final InputStream input = getit();
    return Response.ok(input, MediaType.TEXT_PLAIN_TYPE).build();        
}
于 2013-06-26T00:19:15.990 に答える