2015-11-30 2 views
2

Я разрабатываю задачу, требующую загрузки файлов с заданных URL-адресов, одним из требований является то, что он может обрабатывать сетевые сбои и исключения.Законодательство о расписании в Java

В моей реализации у меня был DonwloadManager, который назначает поток для каждого URL-адреса, чтобы не блокировать.

Проблема в том, что я не уверен, как издеваться над ошибками и исключениями с помощью кода, я попытался использовать Quartz в качестве планировщика и задание, которое генерирует только исключение, но насколько я знаю, планировщик работает в разных потоках, так что это никак не повлияет на загружаемый поток.

Есть ли способ издеваться над исключениями в загружаемой теме?

Вот мой код для более прозрений:

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; 
} 

И это скачать рабочий:

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); 
} 

}

Любые предложения о том, как издеваются/проверить исключение программно?

Обновление: Я думал, вместо того, чтобы планировать исключения, было бы проще высмеять полученный в результате статус Будущего, чтобы он возвращал исключение.

ответ

0

в вашем DownloadWorker, сон в течение 6 секунд, и когда вы получаете Future в DownloadManager нитяным установите timeout в 5 секунд s. Теперь вы получите исключение timeout.

Таким образом, перечислите Exceptions, вы хотите поймать в DownloadManager нить и выбросить их из своего DownloadWorker.

Другой путь перекрывая ThredPoolExecutor после выполнения метода в соответствии с этим один:.

Handling exceptions from Java ExecutorService tasks

Обратите внимание, что FutureTask сек ласточки исключения (если вы используете отправить() вместо того, чтобы выполнить() на ExecutorService Имеют Посмотрите на источник code. Правильно делайте правильные исключения из DownloadWorker.

0

ява исполнители другой вариант (см ExecutorService)

  • вы можете использовать метод awaitTermination в исполнителю ждать в текущем потоке для всех задач, чтобы закончить
  • проверку на будущее (элемент возвращается, когда вы отправляете) за исключением