4

このエラーが発生します:

java.net.SocketTimeoutException: Read timed out
http://api.trove.nla.gov.au/result?key=<KEY HERE>&zone=all&reclevel=brief&q=%20am%20only%20yours%20fear&encoding=json
Exception in thread "main" java.lang.NullPointerException   at
trove.connect.TroveService.QueryTrove(TroveService.java:134)    at
datasetconverter.CsvReader2.main(CsvReader2.java:64) Java Result: 1
BUILD SUCCESSFUL (total time: 1 minute 41 seconds)

コードを実行すると:

   public String getJSON(String url, int timeout) throws IOException, Exception {
    try {
        URL u = new URL(url);
        HttpURLConnection c = (HttpURLConnection) u.openConnection();
        c.setRequestMethod("GET");
        c.setRequestProperty("Content-length", "0");
        c.setUseCaches(false);
        c.setAllowUserInteraction(false);
        c.setConnectTimeout(timeout);
        c.setReadTimeout(timeout);
        c.connect();
        int status = c.getResponseCode();

        switch (status) {
            case 504:
            case 503:
                Thread.sleep(10000);
                this.QueryTrove(url);
                break;
            case 200:
            case 201:
                BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
                StringBuilder sb = new StringBuilder();
                String line;
                while ((line = br.readLine()) != null) {
                    sb.append(line+"\n");
                }
                br.close();
                return sb.toString();
        }

    } catch (MalformedURLException ex) {
        System.out.println(ex);
        System.out.println(url);
    } catch (IOException ex) {
        System.out.println(ex);
        System.out.println(url);
    }
    return null;
}


    public int QueryTrove(String query) throws Exception{
        int sum =0;
        String json = getJSON("http://api.trove.nla.gov.au/result?key=<KEY HERE>&zone=all&reclevel=brief&q="+query+"&encoding=json",10000);

        Gson gson = new Gson();

        JsonResponse r = gson.fromJson(json, JsonResponse.class);
        for (Zone zone : r.getResponse().getZones()) {
            sum = sum + Integer.parseInt(zone.records.getTotal());
        }

        return sum;
    }

これは が原因で、setConnectionTimeoutどうすれば修正できますか?

4

1 に答える 1

5

サーバーが応答するのに「read-timeout」パラメーターよりも時間がかかったために、読み取りタイムアウトが発生します。しかし、妥当な読み取りタイムアウト値 (30 秒としましょう) を持っていると仮定すると、読み取りタイムアウトが短すぎることが問題であるとは限りません。サーバーがスタックしていて、答え。

診断するには、次のことができます。

  • まず、ブラウザからアクセスしようとしたときに完全な応答を得るまでにかかる時間を試してみてください。
  • タイムアウトをなくしてみて (デフォルトではタイムアウトなし)、応答があるかどうかを確認してください。

サーバーがブラウザに応答し、Java アプリには応答しない場合は、まず、まったく同じ URL を呼び出していることを確認してください。USER-AGENTが原因でサーバーがあなたを無視している可能性がある場合は、実際のブラウザーになりすましてみてください。

また、友好的なアドバイスとして、タイムアウトをパラメーターとして渡し、妥当なタイムアウトを定義して直接使用します。非常に珍しいユースケースでない限り、この種の抽象化を使用するときにタイムアウトを渡したい人はいません。

于 2012-12-04T08:09:57.743 に答える