Apache Pool 2 - 具有固定容量的预定义对象实例



我想使用Apache Pool 2库,但正在寻找以下功能:

  1. 这些对象不是虚拟的新空实例,而是来自外部数据源的预加载对象。您可以想象每个对象都是唯一的工作配置,可以传递给通用任务,并且此类任务将起作用。我不需要清理对象,只需返回它们即可。
  2. 池中的对象数是固定的。

编写我自己的池不是更好还是有办法使用 apache 来实现这一点?

还是有更好的模式可以使用?

@Kensai 基本上Apache commons Pool也是基于ObjectPoolPattern的

。你可以试试这个.请注意,这使用 ConcurrentQueue,您可以保持最小和最大对象计数相同,以便始终在固定实例上运行。

选项 1https://www.javacodegeeks.com/2013/08/simple-and-lightweight-pool-implementation.html

选项 2https://www.geeksforgeeks.org/object-pool-design-pattern/

注意 - 借用和归还是整个方法是同步的,但您可以以方便的方式覆盖清理/逐出策略

好的,我按照 Apache Pool 网站上的示例并调查了文档,但我真的没有找到如何将我之前创建的对象推送到池中的方法,所以我找到工作的唯一方法虽然真的很丑陋是: 1. 在一个循环中从池中获取虚拟空对象,并将它们放入外部 ArrayList 2. 循环列出和设置对象并将其返回到池中

在我尝试使用以下实现从池中获取对象后,这些对象保留其设置,即预期的行为,但我想宁愿使用工厂来构建 PooledObject,我可以以某种方式将其推送到池中。我尝试了池对象的 use() 或泛型对象工厂的 wrap() 方法,但它没有像我预期的那样工作。所以下面的代码按预期工作,抱歉它很丑陋,因为我刚刚测试了功能:

public class ProxyMetadata  {
public static Logger LOG = LogManager.getLogger(ProxyMetadata.class);
public static List<Proxy> PROXIES = new ArrayList<>();
public static int PROXIES_AVAILABLE;
private static ProxyBufferFactory proxyBufferFactory = new ProxyBufferFactory();
private static GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
private static GenericObjectPool<Proxy> pool;
//Pool<Proxy> pool = new BoundedBlockingPool< Proxy >();

void init() {
final List<Proxy> availableProxies = getAvailableProxies();
genericObjectPoolConfig.setMaxTotal(PROXIES_AVAILABLE);
genericObjectPoolConfig.setBlockWhenExhausted(true);
genericObjectPoolConfig.setTestOnBorrow(true);
//pool = new BoundedBlockingPool< Proxy >();
pool = new GenericObjectPool<Proxy>(proxyBufferFactory,genericObjectPoolConfig);
List<Proxy> initializator = new ArrayList<>();
LOG.debug("Pool management starting...");
LOG.debug("Pool start idle:" + pool.getNumIdle());
LOG.debug("Pool start active:" + pool.getNumActive());
for (int i= 0; i < PROXIES_AVAILABLE; i++){
try {
//final Proxy proxy = new Proxy();
final Proxy proxy = pool.borrowObject();
proxy.setProxyHost(String.valueOf(i));
//proxyBufferFactory.wrap(proxy);
initializator.add(proxy);
//pool.returnObject(proxy);
LOG.debug("Pool idle - loop " + String.valueOf(i)+ ": " + pool.getNumIdle());
LOG.debug("Pool active - loop"+ String.valueOf(i) + ": " + pool.getNumActive());
} catch (Exception e) {
e.printStackTrace();
}
}
LOG.debug("ALL PROXIES BORROWED");
LOG.debug("Pool after borrow idle:" + pool.getNumIdle());
LOG.debug("Pool after borrow active:" + pool.getNumActive());
LOG.debug("Going to return");
for (Proxy proxy : initializator){
pool.returnObject(proxy);
LOG.debug("Pool after return idle:" + pool.getNumIdle());
LOG.debug("Pool after return active:" + pool.getNumActive());
}
LOG.debug("Clearing buffer: " + initializator.size());
initializator.clear();
LOG.debug("Clearing buffer: " + initializator.size());
LOG.debug("Pool status before reborrow.");
LOG.debug("Pool idle:" + pool.getNumIdle());
LOG.debug("Pool active:" + pool.getNumActive());
for (int i= 0; i < PROXIES_AVAILABLE; i++){
try {
final Proxy proxy = pool.borrowObject();
LOG.debug("Pool idle:" + pool.getNumIdle());
LOG.debug("Pool active:" + pool.getNumActive());
LOG.debug("Borrowed final proxy:" + proxy.toString());
} catch (Exception e) {
e.printStackTrace();
}
}

下面是日志输出,可以看到最初借用和配置的借用对象再次可用:

Pool management starting...
Pool start idle:0
Pool start active:0
Pool idle - loop 0: 0
Pool active - loop0: 1
Pool idle - loop 1: 0
Pool active - loop1: 2
Pool idle - loop 2: 0
Pool active - loop2: 3
ALL PROXIES BORROWED
Pool after borrow idle:0
Pool after borrow active:3
Going to return
Pool after return idle:1
Pool after return active:2
Pool after return idle:2
Pool after return active:1
Pool after return idle:3
Pool after return active:0
Clearing buffer: 3
Clearing buffer: 0
Pool status before reborrow.
Pool idle:3
Pool active:0
Pool idle:2
Pool active:1
Borrowed final proxy:Proxy(proxyHost=2, proxyPort=null, proxyUser=null, proxyPassword=null, geoIPLocation=null, isAvailable=true)
Pool idle:1
Pool active:2
Borrowed final proxy:Proxy(proxyHost=1, proxyPort=null, proxyUser=null, proxyPassword=null, geoIPLocation=null, isAvailable=true)
Pool idle:0
Pool active:3
Borrowed final proxy:Proxy(proxyHost=0, proxyPort=null, proxyUser=null, proxyPassword=null, geoIPLocation=null, isAvailable=true)
Process finished with exit code 0

所以行为符合预期,但我只是使用 PooledObject 的 put() 方法作为参数来扩展池,这样您就可以以更直观的方式初始化池......

最新更新