On 9/3/14 9:27 AM, Noriyuki Torii wrote: > Hi, all. > > I found BasePooledObjectFactory.validateObject() of commons-pool > sometimes called > on unexpected timing and I cannot identify the cause. > So I would like to ask some advice. > > I've configured the pool so as to the validateObject() would be > invoked only on instance > creation, but sometimes it was invoked for "non-fresh" instance on borrowing. > > I also attach small reproduction code below. > Can anyone tell it is because some lack of configurations, or, actual > pool's bug?
Thanks for reporting this. Looks like it could be a pool bug. Do you mind opening a JIRA ticket for this? Phil > > Thanks in advance. > ---- > Noriyuki Torii > > ---- > import java.io.*; > import java.util.*; > > import org.apache.commons.pool2.*; > import org.apache.commons.pool2.impl.*; > > public class reproduction > { > private static class MyPooledObj > { > volatile int i = 0; > final String uuid = UUID.randomUUID().toString(); > } > > private static class MyFactory extends > BasePooledObjectFactory<MyPooledObj> > { > @Override > public MyPooledObj create() { > return new MyPooledObj(); > } > > @Override > public PooledObject<MyPooledObj> wrap(MyPooledObj o) { > return new DefaultPooledObject<MyPooledObj>(o); > } > > @Override > public boolean validateObject(PooledObject<MyPooledObj> o) { > MyPooledObj myobj = o.getObject(); > synchronized (myobj) { > myobj.i++; > } > System.out.println("Validated."); > return true; > } > } > > public static void main(String[] args) > throws Exception > { > GenericObjectPoolConfig poolCfg = new GenericObjectPoolConfig() ; > poolCfg.setMaxTotal(1); > poolCfg.setMaxIdle(1); > poolCfg.setBlockWhenExhausted(true); > poolCfg.setMaxWaitMillis(10000); > > poolCfg.setTestOnCreate(true); // should be validated only on creation > poolCfg.setTestOnBorrow(false); > poolCfg.setTestOnReturn(false); > poolCfg.setTestWhileIdle(false); > > final GenericObjectPool<MyPooledObj> pool = > new GenericObjectPool<MyPooledObj>(new MyFactory(), poolCfg); > > final MyPooledObj o = pool.borrowObject(); > System.out.printf("%d: %s\n", o.i, o.uuid); > > Timer t = new Timer(); > t.schedule > (new TimerTask() { > public void run() { > pool.returnObject(o); > } > }, 3000); > > // validation will occur again for non-fresh instance, > // confirmed on commons-pool2-2.2 with jdk1.7.0_55 > MyPooledObj o2 = pool.borrowObject(); > System.out.printf("%d: %s\n", o2.i, o2.uuid); > pool.returnObject(o2); > pool.close(); > > t.cancel(); > } > } > > --------------------------------------------------------------------- > To unsubscribe, e-mail: user-unsubscr...@commons.apache.org > For additional commands, e-mail: user-h...@commons.apache.org > > --------------------------------------------------------------------- To unsubscribe, e-mail: user-unsubscr...@commons.apache.org For additional commands, e-mail: user-h...@commons.apache.org