2012-11-13 5 views

답변

1

awaitTermination 메서드가있는 GenericKeyedObjectPool에 대한 래퍼를 만듭니다. closereturnObject 호출을 확인하고 풀이 닫히고 모든 개체가 반환 된 경우 (이 풀에서 현재 대여 된 총 인스턴스 수는 0 인 경우) 래치를 감소시킬 수 있습니다.

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()의 문서에서

:

풀을 닫습니다. 풀이 닫히면 borrowObject()는 이 IllegalStateException으로 실패하지만 returnObject (Object) 및 invalidateObject (Object)가 계속 작동하고 반환 될 때 반환 된 객체 이 파기됩니다.

+0

답변 해 주셔서 감사합니다. 풀링 된 객체는 데이터베이스/네트워크 연결이므로 가능한 경우 원격 시스템이 닫는 것이 더 편리합니다. 어쨌든, 절대로 되돌릴 수없는 물건을 영원히 기다리고 싶지 않을지도 모른다는 생각이 들었습니다. – palacsint