3

我正在使用 1.6 版本的 apache commons-pool 库。根据javadoc,

whenExhaustedAction 指定了当池用完时 borrowObject() 方法的行为:它可以是 WHEN_EXHAUSTED_FAIL、WHEN_EXHAUSTED_GROW 或 WHEN_EXHAUSTED_BLOCK。

我想使用borrowObject,如果在指定的时间范围内没有得到对象,我需要某种句柄来处理场景(比如我将重新安排任务,如果我没有得到目标对象)

但我在这里得到的唯一选择是 NoSuchElementException,它是一个 RuntimeException,我需要捕获并处理错误场景。我对捕获 RuntimeException 持怀疑态度

这是使用 GenericObjectPool 处理对象饥饿的预期方式还是我有任何其他选择?

4

1 回答 1

2

我查看了borrowObject 文档,它指出它抛出了这些异常

IllegalStateException - after close has been called on this pool.
Exception - when makeObject throws an exception.
NoSuchElementException - when the pool is exhausted and cannot or will not return another instance.

因为NoSuchElementException是这种方法的记录行为,所以抓住它borrowObject并根据自己的喜好进行处理并没有错。

我建议你在调用周围抓住它并用你自己的一个包装,所以如果你的函数中的其他方法抛出NoSuchElementException高级处理程序不会与池耗尽混淆。根据您的偏好和项目要求,可以检查包装器异常或运行时异常。

例如

final T obj;

try
{
  obj = pool.borrowObject( );
}
catch ( NoSuchElementException ex )
{
  throw new MyPoolExhausetdException( ex );
}

// Do something with obj
于 2016-03-17T10:58:23.523 回答