Java 中的调度异常

2023-12-12

我正在开发一个任务,需要从给定的 URL 下载文件,其中一个要求是它可以处理网络故障和异常。

在我的实现中,我有一个 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;
}

这是下载的 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);
}

}

关于如何以编程方式模拟/测试异常有什么建议吗?

更新:我在想,与其调度异常,不如模拟生成的 Future 状态,以便它返回异常会更容易。


In your DownloadWorker,睡眠 6 秒,当您得到Future in DownloadManager线程、集合timeout为 5 秒。现在你会得到timeout例外。

这样,列出来Exceptions你想赶上DownloadManager线程并将它们从你的DownloadWorker.

其他方式是压倒性的ThredPoolExecutor按照此执行方法后:

处理 Java ExecutorService 任务的异常

注意FutureTasks 吞掉异常(如果你使用submit()而不是execute())ExecutorService。看一下源码code。因此,正确地引发异常DownloadWorker.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 中的调度异常 的相关文章

随机推荐

  • Git 恢复:“目标文件为空”。如何重新创建树木?

    注意 我没有此存储库的任何损坏前克隆 我相信我的情况与这里描述的其他人不同 因为我缺少一棵树 而不是一个斑点 发生了什么 当我尝试通过 LAN 通过 SSH 克隆存储库时 Git 返回一条错误 指出存储库已损坏 remote error o
  • Django 通道在模型更改时发送消息

    我正在使用 django channels 在后端组织我的 websocket 现在 除了当数据库中的信息发生更改时向前端发送消息之外 一切正常 有http端点可以改变模型 这是我的 websocket 消费者 import asyncio
  • 如何重复数据框?

    重复一次 data frame 很容易 mt2 lt rbind mtcars mtcars 但是一般来说 类似 R 的方法是什么 如果我想要 10 份mtcars在一起我可以 mt10 lt mtcars for i in 2 10 mt
  • Pry-Remote 未触发 Rails 4

    Problem 在另一个分支升级到 Rails 4 并尝试上次有效的解决方案后使用 Pow on Rails 4 进行遥控撬 我仍然发现新的 Rails 4 和 Pry 调试器有困难 我在运行什么 rvm 1 26 11 latest by
  • 支持 iOS 8 的设备在代码更新后未收到推送通知

    我最近将我的一台测试 iPhone 升级到了 iOS 8 然后升级了 PUSH 注册码 如下 使用 xCode 6 BOOL hasNotificationsEnabled NSString iOSversion UIDevice curr
  • 将 CopyToDataTable 与“new {..}”LINQ 查询一起使用时出现异常

    从这段代码中 我可以按照我的预期调用 bmwCars CopyToDataTable var bmwCars from car in dataTable AsEnumerable where car Field
  • 如何将 ClientScript.RegisterClientScriptBlock 与内联代码一起使用?

    我有 aspx 页面 其中没有隐藏代码 服务器端代码写在带有 runat 服务器属性的标签内 如果我使用 ClientScript RegisterClientScriptBlock this GetType Email GetEmail
  • SQLite游标中moveToFirst()的用途是什么

    我是一个编程新手 我在互联网上找到了这段代码 它运行得很好 Cursor c db query DataBase TB NAME new String DataBase KEY ROWID DataBase KEY RATE DataBas
  • 如何将不常见格式的字符串转换为日期时间

    我使用的是 NET 3 5 并且有一个日期 该日期以字符串形式出现 格式如下 2009 年 1 月 20 日星期二 20 47 43 GMT 第一个问题 该格式的名称是什么 第二个问题 将此字符串转换为日期时间的最简单 最清晰的方法是什么
  • 如何在 iPad 上的 UIWebView 中上传文件?

    我正在开发一个 iPad 应用程序 我的应用程序的一个组件有一个 UIWebView 其网页有一个浏览按钮来上传文件 在本例中为照片 我知道应用程序无法访问文件系统 但我在 App Store 上看到过可以通过照片实现此功能的应用程序 其中
  • 视图的边框纹理

    有没有办法设置边框纹理LinearLayout或任何其他View 由于屏幕尺寸不同 我不能只将图像设置为背景 这是我正在讨论的纹理示例 我尝试使用九片 但它拉伸了应该重复的白线 Draw 9 patch 工具的截图 您可以使用shape像这
  • PackageInfo LoadLabel 性能缓慢

    我正在为 Android 编写一个应用程序 其中获取应用程序的标签 实际名称 非常慢 特别是这段代码的性能非常糟糕 packageInfo loadLabel pm 只是为了给您一些指标 在安装了 400 个应用程序的 Android 设备
  • NES(6502组装)精灵动作

    我目前正在开发 NES 6502 组装游戏 但我不明白如何使精灵移动 我认为它应该是这样工作的 loop LDA 200 will load into the A register the content of address 200 wi
  • IntelliJ:使用 docker jvm 还是 docker maven?

    我有一个 docker jvm 实例 我从命令行使用它来编译和运行 java 代码 IntelliJ 的项目配置要求我指向文件系统上的 jvm 所以 我想知道 我可以配置intellij来使用这个docker容器吗 我想我可以配置一个 do
  • Socket.io 客户端:用一个处理程序响应所有事件?

    是否可以让 socket io 客户端响应所有事件 而无需单独指定每个事件 例如 像这样的东西 显然现在不起作用 var socket io connect http myserver socket on function listen t
  • 为什么 C++ 中析构函数运行两次?

    在做编程作业时 我似乎在基本的 C 概念上遇到了困难 我在程序中发现了该错误 这是由于我的析构函数运行次数超出了我的预期造成的 这是一个代码示例 演示了我做错了什么 直到最基本的部分 include
  • 添加/提交文件到所有分支

    假设我在一个分支上并且索引是脏的 我对文件 x 进行了更改 并且还进行了一些其他更改 有没有办法将文件 x 添加到所有现有分支 像这样的东西 usr bin env bash current branch git rev parse abb
  • 复杂的 git rebase 操作

    看着git rebase手册页 我没有看到任何看起来像我想要的图表 除了有些图表似乎做了与我想要的相反的事情 并且玩弄 onto也没有得到我想要的 让我看看是否可以画出像图中那样的图表git rebase手册页 左侧的竖线是为了使 Mark
  • 如何使用 python 访问 Azure AD 组和用户详细信息?

    params urllib urlencode Specify values for the following required parameters api version 1 5 tenant id vvvvvvvvXXXXXX he
  • Java 中的调度异常

    我正在开发一个任务 需要从给定的 URL 下载文件 其中一个要求是它可以处理网络故障和异常 在我的实现中 我有一个 DonwloadManager 为每个 URL 分配一个线程 以免阻塞 问题是我不确定如何通过代码模拟失败和异常 我尝试使用