1

このプログラムは、ファイルを読み取り、各行を http として送信するために使用されます。ファイルのすべての行が URL です。

例 http: //localhost:8080/?a=1&b=2

    PoolingClientConnectionManager pcm = new PoolingClientConnectionManager();
    pcm.setMaxTotal(200);
    pcm.setDefaultMaxPerRoute(20);

    HttpClient client = new DefaultHttpClient(pcm);
    ExecutorService executorService = Executors.newFixedThreadPool(10);

    try (BufferedReader bfrDataSource = new BufferedReader(new FileReader(path))) {
        while((line=bfrDataSource.readLine()) != null){
            executorService.execute(new SendTask(line, client));
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }

    executorService.shutdown();
    client.getConnectionManager().shutdown();

SendTask.java

public class SendTask implements Runnable {

private String url;
private final HttpClient client;

public SendTask(String url, HttpClient client){
    this.url = url;
    this.client = client;
}

@Override
public void run() {

    HttpGet httpGet = new HttpGet(url);
    try {
        HttpResponse response = client.execute(httpGet);
        response.getEntity().getContent().close();

    } catch (ClientProtocolException e1) {
        e1.printStackTrace();
    } catch (IOException e1) {
        e1.printStackTrace();
    } finally{
        httpGet.abort();
    }
}

}

500,000 行のファイルを送信すると、機能します。しかし、100,000 行を送信すると、1 つのエラーが発生しました: java.lang.OutOfMemoryError: GC オーバーヘッド制限を超えました。

  • 少なくとも 100 万行を送信できるようにプログラムを変更するにはどうすればよいですか? ありがとう!
4

1 に答える 1

1

Executors.newFixedThreadPool() によって作成されたスレッド プールは、無制限のキューによってバックアップされます。新しいタスクをそれに送信し、使用可能なワーク スレッドがない場合、キューにタスクをキャッシュします。そのため、OOM 例外が発生します。

これを修正するには、バインドされた作業キューを持つスレッド プールを使用する必要があります。

ExecutorService executorService = new ThreadPoolExecutor(10, 10, 0, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());

さまざまなキューの実装を使用できますが、あなたの場合は SynchronousQueue で十分です。

さらに、ワーカーがジョブを完了したら、httpclient をシャットダウンする必要があります。

httpclient.getConnectionManager().shutdown();

詳細については、 httpclient javadocを確認してください。

于 2013-01-29T05:07:17.760 に答える