2

我刚刚在我的runnable的run()方法中写了这段代码:

try {
    dbConnection = MyApp.datasource.getConnection();
} catch (SQLException e) {
    logger.log(Level.SEVERE, "Could not obtain a DB connection! Re-enqueuing this task. Message: " + e.getMessage(), e);
    MyApp.executor.execute(this);
    return;
}

如您所见,如果任务无法获得数据库连接,它应该重新排队,进入它在运行之前所在的同一队列。

我认为这可能是安全的,但感觉很有趣,我只是想确保没有任何我遗漏的问题。

谢谢!

4

2 回答 2

5

就执行者而言,这很好。

但请记住,失败可能会很快发生,然后 Executor 可能会快速重新运行您的代码。这可能会导致烧毁大量 CPU 而没有结果。

内置强制重试延迟和最大循环计数。

于 2011-02-17T21:20:22.083 回答
4
  1. 有发生所谓的有毒信息SQLException的风险:如果无法逃脱,任务将无限重复。您必须提供某种计数器或计时器。

  2. 根据 executor 的占用情况(已经调度了多少并发任务),重试之间的间隔可能会有很大差异。您可能会使用 100% 的 CPU,或者等待重试很长时间。

  3. 如果偶然地,您的任务(重新调度自身的任务)等待(重新调度的)调用的结果,当执行程序仅在一个线程上运行时,您可能会遇到死锁。

  4. 您正在使用 , 的原始字段MyApp,这似乎是一个不好的模式。

至于总体思路:为什么不只是有一个循环run()?您想对正在执行的其他任务更加“公平”吗?

于 2011-02-17T21:21:11.880 回答