【问题标题】:Jackson JSON how to set http connection and read timeoutJackson JSON如何设置http连接和读取超时
【发布时间】:2016-03-14 00:08:44
【问题描述】:

(jersey-common=2.21.0, jackson-core=2.6.1)

如果调用了 createParser(URL url),我如何设置 http 连接超时(连接、读取)?使用的默认值是什么?

    JsonFactory jsonF = new JsonFactory();
    jsonF.enable(JsonParser.Feature.AUTO_CLOSE_SOURCE);
    JsonParser jsonP = jsonF.createParser(url); // URL instance
    try {
        JsonToken token;
        while ( (token=jsonP.nextToken()) != null) {
           if (token == JsonToken.START_OBJECT)
           ..rest "json sax" parser code...
        }
    } finally {
        jsonP.close();
    }

当 webapp 停止读取 json 源时,我每周有几次反复出现问题,任务每 30 分钟自动运行一次。我怀疑这个 http 调用会停止并开始堆积,直到 JVM 宕机。

我不应该在生产应用中使用 createParser(URL) 函数吗?

【问题讨论】:

    标签: java json jackson tomcat7 jersey-2.0


    【解决方案1】:

    你可以破解价值观

    System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
    System.setProperty("sun.net.client.defaultReadTimeout", "10000");
    

    有关设置的更多信息,请访问 https://docs.oracle.com/javase/7/docs/technotes/guides/net/properties.html

    或者您可以改为进行适当的调用,然后将结果传递给 json 解析器。我会选择后者。

    所以简单地说,虽然 URL 是很好的轻量级替代方案,但我建议切换到 apache http 客户端或一些高级解决方案。

    【讨论】:

    • 我接受这个答案,很可能该方法太轻量级的用例。我去传递取自 HttpURLConnection 的 InputStream,我不想弄乱系统级默认值,尤其是在 Tomcat webapp 环境中。我跳过 ApacheHttp 因为没有引入新的依赖项,这是一个非常简单的用例。
    【解决方案2】:

    这种特定的读取方法是为了方便,但不可配置,通常对大多数生产用途没有那么有用。

    相反,您可能希望使用其他方式从URL 端点获取InputStream,然后将其传递给ObjectMapper / ObjectReader;这允许完全控制连接、超时等细节。它允许您使用除 JDK 配备的默认客户端之外的其他 HTTP 客户端。

    【讨论】:

    • 你有一些在特别实用程序中使用 ObjectMapper+ObjectReader 的好例子吗?我一直使用 JsonFactory+JsonParser 来使用 jsonP.nextToken() 循环读取大型 json 文档,它非常适合并希望保留这个“萨克斯流”用例。
    • 你也可以将InputStream传递给JsonFactory,同样的区别。如果您不想,则无需从流式传输更改为数据绑定。
    猜你喜欢
    • 2013-11-01
    • 2015-09-16
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2017-07-08
    相关资源
    最近更新 更多