2012-11-13 6 views

ответ

1

Создайте обертку для GenericKeyedObjectPool, которая имеет необходимый метод awaitTermination. Вы можете проверить close и returnObject называть и декретировать защелку, если пул закрыт и каждый объект был возвращен (= общее количество экземпляров, заимствованных из этого пула, равно нулю).

public final class ListenablePool<K, V> { 

    private final GenericKeyedObjectPool<K, V> delegate; 

    private final CountDownLatch closeLatch = new CountDownLatch(1); 

    private final AtomicBoolean closed = new AtomicBoolean(); 

    public ListenablePool(final KeyedPoolableObjectFactory<K, V> factory) { 
     this.delegate = new GenericKeyedObjectPool<K, V>(factory); 
    } 

    public V borrowObject(final K key) throws Exception { 
     return delegate.borrowObject(key); 
    } 

    public void returnObject(final K key, final V obj) throws Exception { 
     try { 
      delegate.returnObject(key, obj); 
     } finally { 
      countDownIfRequired(); 
     } 
    } 

    private void countDownIfRequired() { 
     if (closed.get() && delegate.getNumActive() == 0) { 
      closeLatch.countDown(); 
     } 
    } 

    public void close() throws Exception { 
     try { 
      delegate.close(); 
     } finally { 
      closed.set(true); 
      countDownIfRequired(); 
     } 
    } 

    public void awaitTermination() throws InterruptedException { 
     closeLatch.await(); 
    } 

    public void awaitTermination(final long timeout, final TimeUnit unit) 
      throws InterruptedException { 
     closeLatch.await(timeout, unit); 
    } 

    public int getNumActive() { 
     return delegate.getNumActive(); 
    } 

    // other delegate methods 
} 
1

Вы должны быть в безопасности, просто закрыв его, не дожидаясь возвращения всех объектов.

Из документов в GenericKeyedObjectPool.html#close():

Замыкает бассейн. Как только пул закрыт, заимствование объекта() завершится неудачно с IllegalStateException, но returnObject (Object) и invalidateObject (Object) будет продолжать работать, с возвращенными объектами , уничтоженным при возврате.

+0

Спасибо за ответ! Объединенные объекты - это базы данных/сетевые подключения, поэтому для удаленных систем более удобно закрывать их, если это возможно. Во всяком случае, это заставило меня подумать, что я, возможно, не захочу ждать навсегда объекта, который никогда не может быть возвращен. – palacsint

Смежные вопросы