-1

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

This http://stackoverflow.com/a/3414495/32090助けてくれるでしょう –

答えて

0

ファイルをローカルにキャッシュし、後で処理することをお勧めします。

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

これは、たとえリンクを維持していても、ネットワークの停止やQoSの低下などの可能性があるため、信頼性の低いファイルを取得する可能性があるからです。あなたはまた、処理の全期間にわたってサーバがそれを更新するのを防ぐかもしれません。それは少し反社会的です。

+0

あなたの答えをありがとう。良いヒントですが、httpclientがファイル全体をディスクに保存していますか?私はそれがこのように動作するとは思わない、多分いくつかの断片を保存する? – javanna

+0

いいえ、ファイルをディスクに明示的にストリームすることをお勧めします。新しい一時ファイルを作成し、出力ストリームを開き、gzip入力ストリームをファイルにコピーします。 – AndyT

+0

私は理解しました。この方法では、ファイル全体を保存している間に最初は待ち時間が長くなりますが、socketexceptionがまったく実行されなくなってしまいます。右?私はちょうどhttpclientの動作とまったく同じではないと言っていたが、これは私を助けるだろう! – javanna

0

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

関連する問題