1

さまざまなURLからファイルを取得するアプリケーションに取り組んでいます。

ダウンロードするターゲットを含むTreeSetがあります。これはループで処理され、各アイテムはExecutorServiceで呼び出されます。ここにいくつかのコードがあります:

private void retrieveDataFiles() {
    if (this.urlsToRetrieve.size() > 0) {
        System.out.println("Target URLs to retrieve: " + this.urlsToRetrieve.size());
        ExecutorService executorProcessUrls = Executors.newFixedThreadPool(this.urlsToRetrieve.size());//could use fixed pool based on size of urls to retrieve
        for (Entry target : this.urlsToRetrieve.entrySet()) {
            final String fileName = (String) target.getKey();
            final String url = (String) target.getValue();

            String localFile = localDirectory + File.separator + fileName;
            System.out.println(localFile);
            executorProcessUrls.submit(new WikiDumpRetriever(url, localFile));
            dumpFiles.add(localFile); 
            //TODO: figure out why only 2 files download
        }
        executorProcessUrls.shutdown();
        try {
            executorProcessUrls.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
        } catch (InterruptedException ex) {
            System.out.println("retrieveDataFiles InterruptedException: " + ex.getMessage());
        }
    } else {
        System.out.println("No target URL's were retrieved");
    }
}

次に、WikiDumpRetriever:

private static class WikiDumpRetriever implements Runnable {

    private String wikiUrl;
    private String downloadTo;

    public WikiDumpRetriever(String targetUrl, String localDirectory) {
        this.downloadTo = localDirectory;
        this.wikiUrl = targetUrl;
    }

    public void downloadFile() throws FileNotFoundException, IOException, URISyntaxException {
        HTTPCommunicationGet httpGet = new HTTPCommunicationGet(wikiUrl, "");
        httpGet.downloadFiles(downloadTo);
    }

    @Override
    public void run() {
        try {
            downloadFile();
        } catch (FileNotFoundException ex) {
            System.out.println("WDR: FileNotFound " + ex.getMessage());
        } catch (IOException ex) {
            System.out.println("WDR: IOException " + ex.getMessage());
        } catch (URISyntaxException ex) {
            System.out.println("WDR: URISyntaxException " + ex.getMessage());
        }
    }
}

ご覧のとおり、これは内部クラスです。TreeSetには次のものが含まれます。

キー:値

enwiki-latest-pages-articles.xml.bz2:http ://dumps.wikimedia.org/enwiki/latest/enwiki-latest-pages-articles.xml.bz2

elwiki-latest-pages-articles.xml.bz2:http ://dumps.wikimedia.org/enwiki/latest/elwiki-latest-pages-articles.xml.bz2

zhwiki-latest-pages-articles.xml.bz2:http ://dumps.wikimedia.org/enwiki/latest/zhwiki-latest-pages-articles.xml.bz2

hewiki-latest-pages-articles.xml.bz2:http ://dumps.wikimedia.org/enwiki/latest/hewiki-latest-pages-articles.xml.bz2

問題は、このプロセスが4つのファイルのうち2つをダウンロードすることです。4つすべてが利用可能であり、ダウンロードできることを知っています。ただし、一度に処理できるのはそのうちの2つだけです。

誰かが私のためにこれに光を当てることができますか?私は何が欠けているのか、何が間違っているのですか?

ありがとうnathj07

4

1 に答える 1

1

ppeterkaのおかげで-それはソースからの制限でした。したがって、これを克服するために、固定スレッドプールサイズを2に設定しました。これは、2つのファイルのみが同時にダウンロードされることを意味します。

答えは、ベンダーが課した制限を見つけて、スレッドプールを設定することでした。

ExecutorService executorProcessUrls = Executors.newFixedThreadPool(2);

答えを受け入れたかったのですが、コメントではうまくいかなかったようです。これが間違った方法だった場合は申し訳ありません。

すべてのポインタに感謝します-「グループ思考」は私にとってこれを解決するのに本当に役立ちました。

于 2012-11-05T10:17:20.957 に答える