pp.minSize = min;
pp.maxSize = getBeanCount();
pp.blockingTimeout = 30000;
pp.idleTimeout = idle;
final TxConnectionManager cm = getCM(pp, trackByTx);
try
{
int totalThreads = pp.maxSize * threadsPerConnection;
finishedThreadCount = new CountDownLatch(totalThreads);
log.info("Blocking test with connections: " + pp.maxSize + " totalThreads: " + totalThreads + " reps: " + reps);
for (int i = 0; i < totalThreads; i++)
{
Runnable t = new Runnable()
{
int id;
public void run()
{
id = startedThreadCount.getAndIncrement();
long duration = 0;
long getConnection = 0;
long returnConnection = 0;
long heldConnection = 0;
for (int j = 0; j < reps; j++)
{
ConnectionListener cl = null;
try
{
if (tm == null)
throw new SystemException("TM is null");
tm.begin();
long startGetConnection = System.currentTimeMillis();
cl = cm.getManagedConnection(subject, cri);
cl.enlist();
long endGetConnection = System.currentTimeMillis();
TxConnectionManagerStressTestCase.this.connectionCount.incrementAndGet();
Thread.sleep(sleepTime);
if (tm == null)
throw new SystemException("TM is null");
tm.commit();
long startReturnConnection = System.currentTimeMillis();
if (!trackByTx)
{
cl.delist();
cm.returnManagedConnection(cl, false);
}
cl = null;
long endReturnConnection = System.currentTimeMillis();
duration += (endReturnConnection - startGetConnection);
getConnection += (endGetConnection - startGetConnection);
returnConnection += (endReturnConnection - startReturnConnection);
heldConnection += (startReturnConnection - endGetConnection);
}
catch (NotSupportedException nse)
{
TxConnectionManagerStressTestCase.this.log.info("error: iterationCount: " + j + ", connectionCount: " + TxConnectionManagerStressTestCase.this.connectionCount.get() + " " + nse.getMessage());
TxConnectionManagerStressTestCase.this.errorCount.incrementAndGet();
TxConnectionManagerStressTestCase.this.error = nse;
TxConnectionManagerStressTestCase.this.failed = true;
}
catch (SystemException se)
{
TxConnectionManagerStressTestCase.this.log.info("error: iterationCount: " + j + ", connectionCount: " + TxConnectionManagerStressTestCase.this.connectionCount.get() + " " + se.getMessage());
TxConnectionManagerStressTestCase.this.errorCount.incrementAndGet();
TxConnectionManagerStressTestCase.this.error = se;
TxConnectionManagerStressTestCase.this.failed = true;
}
catch (RollbackException rbe)
{
TxConnectionManagerStressTestCase.this.log.info("error: iterationCount: " + j + ", connectionCount: " + TxConnectionManagerStressTestCase.this.connectionCount.get() + " " + rbe.getMessage());
TxConnectionManagerStressTestCase.this.errorCount.incrementAndGet();
TxConnectionManagerStressTestCase.this.error = rbe;
TxConnectionManagerStressTestCase.this.failed = true;
}
catch (HeuristicMixedException hme)
{
TxConnectionManagerStressTestCase.this.log.info("error: iterationCount: " + j + ", connectionCount: " + TxConnectionManagerStressTestCase.this.connectionCount.get() + " " + hme.getMessage());
TxConnectionManagerStressTestCase.this.errorCount.incrementAndGet();
TxConnectionManagerStressTestCase.this.error = hme;
TxConnectionManagerStressTestCase.this.failed = true;
}
catch (HeuristicRollbackException hre)
{
TxConnectionManagerStressTestCase.this.log.info("error: iterationCount: " + j + ", connectionCount: " + TxConnectionManagerStressTestCase.this.connectionCount.get() + " " + hre.getMessage());
TxConnectionManagerStressTestCase.this.errorCount.incrementAndGet();
TxConnectionManagerStressTestCase.this.error = hre;
TxConnectionManagerStressTestCase.this.failed = true;
}
catch (ResourceException re)
{
TxConnectionManagerStressTestCase.this.log.info("error: iterationCount: " + j + ", connectionCount: " + TxConnectionManagerStressTestCase.this.connectionCount.get() + " " + re.getMessage());
TxConnectionManagerStressTestCase.this.errorCount.incrementAndGet();
TxConnectionManagerStressTestCase.this.error = re;
TxConnectionManagerStressTestCase.this.failed = true;
}
catch (InterruptedException ie)
{
break;
}
finally
{
if (cl != null)
cm.returnManagedConnection(cl, true);
try
{
if (tm == null)
throw new SystemException("TM is null");
Transaction tx = tm.getTransaction();
if (tx != null)
log.info("TX STATUS=" + TxUtils.getStatusAsString(tx.getStatus()));
if (tx != null && TxUtils.isUncommitted(tx))
{
tm.rollback();
}
}
catch (SystemException se)
{
TxConnectionManagerStressTestCase.this.log.info("error: iterationCount: " + j + ", connectionCount: " + TxConnectionManagerStressTestCase.this.connectionCount.get() + " " + se.getMessage());
TxConnectionManagerStressTestCase.this.errorCount.incrementAndGet();
TxConnectionManagerStressTestCase.this.error = se;
TxConnectionManagerStressTestCase.this.failed = true;
}
}
}
TxConnectionManagerStressTestCase.this.elapsed.addAndGet(duration);
TxConnectionManagerStressTestCase.this.getConnection.addAndGet(getConnection);
TxConnectionManagerStressTestCase.this.returnConnection.addAndGet(returnConnection);
TxConnectionManagerStressTestCase.this.held.addAndGet(heldConnection);
finishedThreadCount.countDown();
}
};
new Thread(t).start();
}
finishedThreadCount.await();
// Stop the pool/idle remover, otherwise the following checks will be random
TestPool pool = (TestPool) cm.getPoolingStrategy();
pool.shutdownWithoutClear();
float expected = totalThreads * reps;
float lessWaiting = getConnection.get() - (threadsPerConnection - 1) * held.get();
log.info("completed " + getName() + " with connectionCount: " + connectionCount.get() + ", expected : " + expected);