-1

私のコードは、GZIPInputStream内に大きなxmlファイル(500MB)をダウンロードし、それを処理してすべてのオブジェクトに対していくつかの操作を実行する必要があります。これらの操作は完了するまでに時間がかかり、処理するオブジェクトがたくさんあります。コモンズhttp-client3.1とstaxを使用しています。

public void download(String url) throws HttpException, IOException, 
                XMLStreamException, FactoryConfigurationError {

        GetMethod getMethod = new GetMethod(url);
        try {
            httpClient.executeMethod(getMethod);    
            Header contentEncoding = getMethod.getResponseHeader("Content-Encoding");
            if (contentEncoding != null) {
                String acceptEncodingValue = contentEncoding.getValue();
                if (acceptEncodingValue.indexOf("gzip") != -1) {
                    processStream(new GZIPInputStream(getMethod.getResponseBodyAsStream()));
                    return;
                }
            }

            processStream(getMethod.getResponseBodyAsStream());
            return;           
        } finally {
            getMethod.releaseConnection();
        }
    }

    protected void processStream(InputStream inputStream) throws XMLStreamException, FactoryConfigurationError {
        XMLStreamReader xmlStreamReader = XMLInputFactory.newFactory().createXMLStreamReader(inputStream);
        //parses xml with Stax           
        //executes some long operations for each object
    }

コードを実行すると、2〜3時間後に。が表示されるまで機能しSocketException: Connection resetます。サーバーが接続を閉じたようですが、正しいですか?サーバー側で変更を加えずにこのエラーを回避する方法はありますか?そうでない場合、アプリケーションを最初から再実行しないようにするにはどうすればよいですか?

com.ctc.wstx.exc.WstxIOException: Connection reset
    at com.ctc.wstx.sr.StreamScanner.throwFromIOE(StreamScanner.java:708)
    at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1086)
    .................
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:168)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
    at org.apache.commons.httpclient.ChunkedInputStream.read(ChunkedInputStream.java:182)
    at java.io.FilterInputStream.read(FilterInputStream.java:116)
    at org.apache.commons.httpclient.AutoCloseInputStream.read(AutoCloseInputStream.java:108)
    at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:221)
    at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:141)
    at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:92)
    at java.io.FilterInputStream.read(FilterInputStream.java:90)
    at com.ctc.wstx.io.UTF8Reader.loadMore(UTF8Reader.java:365)
    at com.ctc.wstx.io.UTF8Reader.read(UTF8Reader.java:110)
    at com.ctc.wstx.io.ReaderSource.readInto(ReaderSource.java:84)
    at com.ctc.wstx.io.BranchingReaderSource.readInto(BranchingReaderSource.java:57)
    at com.ctc.wstx.sr.StreamScanner.loadMore(StreamScanner.java:992)
    at com.ctc.wstx.sr.StreamScanner.loadMore(StreamScanner.java:1034)
    at com.ctc.wstx.sr.StreamScanner.getNextChar(StreamScanner.java:794)
    at com.ctc.wstx.sr.BasicStreamReader.parseNormalizedAttrValue(BasicStreamReader.java:1900)
    at com.ctc.wstx.sr.BasicStreamReader.handleNsAttrs(BasicStreamReader.java:3037)
    at com.ctc.wstx.sr.BasicStreamReader.handleStartElem(BasicStreamReader.java:2936)
    at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2848)
    at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1019)
4

2 に答える 2

0

1 つの提案は、ファイルをローカルにキャッシュし、後で処理することです。

すなわち。ハンドラは単にストリームを読み取り、それをディスク上の一時ファイルに書き込みます。次に、ストリームを閉じて、一時ファイルからのデータを処理します。

リンクを維持できたとしても、ネットワークが停止したり、QoS が低下したりする可能性があるため、ファイルの取得が信頼できなくなる可能性があるため、これはおそらく良い方法です。また、処理の全期間にわたってサーバーが更新するのを妨げている可能性もありますが、これは少し反社会的です.

于 2011-12-15T14:31:28.357 に答える
0

xml をローカル コンピューターにコピーできない場合は、接続がタイムアウトしたかどうかを確認してください。xml の処理に時間がかかりすぎて、中間サーバーの 1 つによって接続がリセットされる可能性があります。

于 2011-12-16T21:14:54.583 に答える