내 신청서에 GenericKeyedObjectPool
이 있습니다. close
메서드를 사용하여 닫을 수 있지만 클라이언트가 빌려온 모든 객체를 풀로 반환 할 때까지 기다려야합니까?GenericKeyedObjectPool을 안전하게 종료하는 방법은 무엇입니까?
ExecutorService.awaitTermination
과 같은 것이 필요합니다.
내 신청서에 GenericKeyedObjectPool
이 있습니다. close
메서드를 사용하여 닫을 수 있지만 클라이언트가 빌려온 모든 객체를 풀로 반환 할 때까지 기다려야합니까?GenericKeyedObjectPool을 안전하게 종료하는 방법은 무엇입니까?
ExecutorService.awaitTermination
과 같은 것이 필요합니다.
awaitTermination
메서드가있는 GenericKeyedObjectPool
에 대한 래퍼를 만듭니다. close
및 returnObject
호출을 확인하고 풀이 닫히고 모든 개체가 반환 된 경우 (이 풀에서 현재 대여 된 총 인스턴스 수는 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
}
모든 개체가 반환되기를 기다리지 않고 닫는 것만으로 안전해야합니다. GenericKeyedObjectPool.html#close()의 문서에서
:
풀을 닫습니다. 풀이 닫히면 borrowObject()는 이 IllegalStateException으로 실패하지만 returnObject (Object) 및 invalidateObject (Object)가 계속 작동하고 반환 될 때 반환 된 객체 이 파기됩니다.
답변 해 주셔서 감사합니다. 풀링 된 객체는 데이터베이스/네트워크 연결이므로 가능한 경우 원격 시스템이 닫는 것이 더 편리합니다. 어쨌든, 절대로 되돌릴 수없는 물건을 영원히 기다리고 싶지 않을지도 모른다는 생각이 들었습니다. – palacsint