diff --git a/httpcore5/src/main/java/org/apache/hc/core5/pool/StrictConnPool.java b/httpcore5/src/main/java/org/apache/hc/core5/pool/StrictConnPool.java index 0bc0c1b6d..f5c3e4285 100644 --- a/httpcore5/src/main/java/org/apache/hc/core5/pool/StrictConnPool.java +++ b/httpcore5/src/main/java/org/apache/hc/core5/pool/StrictConnPool.java @@ -157,7 +157,7 @@ public void close() { } private PerRoutePool getPool(final T route) { - return this.routeToPool.computeIfAbsent(route, r -> new PerRoutePool<>(route, this.disposalCallback)); + return this.routeToPool.computeIfAbsent(route, r -> new PerRoutePool<>(route, this.disposalCallback, this.policy)); } @Override @@ -755,11 +755,13 @@ static class PerRoutePool { private final Set> leased; private final LinkedList> available; private final DisposalCallback disposalCallback; + private final PoolReusePolicy policy; - PerRoutePool(final T route, final DisposalCallback disposalCallback) { + PerRoutePool(final T route, final DisposalCallback disposalCallback, final PoolReusePolicy policy) { super(); this.route = route; this.disposalCallback = disposalCallback; + this.policy = policy; this.leased = new HashSet<>(); this.available = new LinkedList<>(); } @@ -818,7 +820,16 @@ public void free(final PoolEntry entry, final boolean reusable) { final boolean found = this.leased.remove(entry); Asserts.check(found, "Entry %s has not been leased from this pool", entry); if (reusable) { - this.available.addFirst(entry); + switch (this.policy) { + case LIFO: + this.available.addFirst(entry); + break; + case FIFO: + this.available.addLast(entry); + break; + default: + throw new IllegalStateException("Unexpected ConnPoolPolicy value: " + policy); + } } }