Schedule Ausnahmen in Java

Ich entwickle eine Aufgabe, bei der Dateien von bestimmten URLs heruntergeladen werden müssen. Eine der Anforderungen besteht darin, dass Netzwerkfehler und Ausnahmen behandelt werden können.

In meiner Implementierung hatte ich einen DonwloadManager, der jedem URL einen Thread zuweist, um nicht zu blockieren.

Das Problem ist, dass ich nicht sicher bin, wie ich Fehler und Ausnahmen über den Code verspotten soll. Ich habe versucht, Quartz als Scheduler und einen Job zu verwenden, der nur Ausnahmen auslöst. Soweit ich weiß, wird der Scheduler auf einem anderen Thread ausgeführt. wirkt sich überhaupt nicht auf den Download-Thread aus.

Gibt es eine Möglichkeit, die Ausnahmen im Download-Thread zu verspotten?

Hier ist mein Code für mehr Einblicke:

public class DownloadManager {

int allocatedMemory = 0;

void validateURLs(String[] urls) {
    if (urls.length == 0) {
        throw new IllegalArgumentException("URLs List is empty");
    }
}

public ArrayList<Status> downloadURLs(String[] urls, int memorySize) throws Exception {
    validateURLs(urls);
    ExecutorService executor = Executors.newWorkStealingPool();
    CompletionService<Status> completionService = new ExecutorCompletionService<Status>(executor);
    ArrayList<Status> downloadStatus = new ArrayList<Status>();
    allocatedMemory = memorySize / urls.length;
    for (String url : urls) {
       completionService.submit(new DownloadWorker(url, allocatedMemory));
    }
    for(int i=0;i<urls.length;i++){
       Future<Status> URLStatus =  completionService.take();
        System.out.println(URLStatus.get());
        downloadStatus.add(URLStatus.get());
    }
    executor.shutdown();
    return downloadStatus;
}

Und das ist der Download Worker:

class DownloadWorker implements Callable<Status> {

static final int SUCCESS = 1, FAILURE = 0;

private int bufferSize;

private String assignedURL;

public DownloadWorker(String assignedURL, int bufferSize) {
    this.bufferSize = bufferSize;
    this.assignedURL = assignedURL;
}

public Status call() throws Exception {
    URLConnection openConnection = new URL(assignedURL).openConnection();
    openConnection.addRequestProperty("User-Agent",
            "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/39.0");
    String outputFileName = assignedURL.substring(assignedURL.lastIndexOf("/") + 1);
    RandomAccessFile outputFile = new RandomAccessFile(outputFileName, "rw");
    ReadableByteChannel inputChannel = Channels.newChannel(openConnection.getInputStream());
    FileChannel outputChannel = outputFile.getChannel();
    ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
    while (inputChannel.read(buffer) > 0) {
        buffer.flip();
        for (int i = 0; i < buffer.limit(); i++) {
            outputChannel.write(buffer);
        }
        buffer.clear();
    }
    outputChannel.close();
    inputChannel.close();
    outputFile.close();
    return new Status(assignedURL, true);
}

}

Haben Sie Vorschläge, wie Sie die Ausnahme programmgesteuert verspotten / testen können?

Update: Ich dachte, anstatt Ausnahmen zu planen, wäre es einfacher, den resultierenden Future-Status zu verspotten, sodass eine Ausnahme zurückgegeben wird.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage