编程语言
首页 > 编程语言> > Java的流媒体球衣2?

Java的流媒体球衣2?

作者:互联网

我一直在尝试让json流在jersey 2中工作.对于我来说,直到流完成为止,没有流.

我尝试了这个示例,试图模拟缓慢的数据生成器.

@Path("/foo")
@GET
public void getAsyncStream(@Suspended AsyncResponse response) {
    StreamingOutput streamingOutput = output -> {

        JsonGenerator jg = new ObjectMapper().getFactory().createGenerator(output, JsonEncoding.UTF8);
        jg.writeStartArray();

        for (int i = 0; i < 100; i++) {
            jg.writeObject(i);

            try {
                Thread.sleep(100);
            }
            catch (InterruptedException e) {
                logger.error(e, "Error");
            }
        }

        jg.writeEndArray();

        jg.flush();
        jg.close();

    };

    response.resume(Response.ok(streamingOutput).build());
}

但是jersey只坐在那里,直到完成json生成器以返回结果为止.我正在看结果在查尔斯代理中通过.

我需要启用某些功能吗?不知道为什么这不会流出来

编辑:

这实际上可能是有效的,但并非我所期望的那样.我不认为流正在实时编写我想要的东西,更多的是不必缓冲响应并立即将其写出给客户端.如果我运行一百万次循环并且没有线程睡眠,那么数据确实会分块写入,而不必将其缓冲在内存中.

解决方法:

您的编辑正确.它按预期工作. StreamingOutput只是一个包装,让我们直接将其写入响应流,但实际上并不意味着响应是在每个服务器端写入该流时流式传输的.此外,就客户端而言,AsyncResponse不提供任何不同的响应.它只是为了帮助提高长时间运行的任务的吞吐量.长时间运行的任务实际上应该在另一个线程中完成,因此该方法可以返回.

>在Asynchronous Server API上查看更多

您似乎正在寻找的是Chunked Output

Jersey offers a facility for sending response to the client in multiple more-or-less independent chunks using a chunked output. Each response chunk usually takes some (longer) time to prepare before sending it to the client. The most important fact about response chunks is that you want to send them to the client immediately as they become available without waiting for the remaining chunks to become available too.

由于JsonGenerator期望有一个OutputStream(我们不使用其中的ChuckedOutput),因此不知道它将如何在您的特定用例下工作,但这是一个简单的示例

@Path("async")
public class AsyncResource {

    @GET
    public ChunkedOutput<String> getChunkedStream() throws Exception {
        final ChunkedOutput<String> output = new ChunkedOutput<>(String.class);

        new Thread(() -> {
            try {
                String chunk = "Message";

                for (int i = 0; i < 10; i++) {
                    output.write(chunk + "#" + i);
                    Thread.sleep(1000);
                }
            } catch (Exception e) {
            } finally {
                try {
                    output.close();
                } catch (IOException ex) {
                    Logger.getLogger(AsyncResource.class.getName())
                          .log(Level.SEVERE, null, ex);
                }
            }
        }).start();
        return output;
    }
}

注意:我在开始时无法正常工作.我只会得到延迟的完整结果.问题似乎出在与程序完全分开的地方.实际上是我的AVG引起了问题.某些名为“ LinkScanner”的功能正在阻止该分块过程的发生.我禁用了该功能,它开始起作用.

我没有进行太多的研究,也不确定安全性,因此我不确定为什么AVG应用程序会出现问题.

编辑

似乎真正的问题是由于Jersey缓冲了响应以便计算Content-Length标头.您可以看到this post,了解如何更改此行为

标签:jersey-2-0,jetty,dropwizard,json,java
来源: https://codeday.me/bug/20191028/1952400.html