in geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/SinglePoolConnectionInterceptor.java [60:113]
protected void internalGetConnection(ConnectionInfo connectionInfo) throws ResourceException {
synchronized (pool) {
if (destroyed) {
throw new ResourceException("ManagedConnection pool has been destroyed");
}
ManagedConnectionInfo newMCI;
if (pool.isEmpty()) {
next.getConnection(connectionInfo);
connectionCount++;
if (log.isLoggable(Level.FINEST)) {
log.log(Level.FINEST,"Supplying new connection MCI: " + connectionInfo.getManagedConnectionInfo() + " MC: " + connectionInfo.getManagedConnectionInfo().getManagedConnection() + " from pool: " + this);
}
return;
} else {
newMCI = pool.remove(pool.size() - 1);
}
if (connectionCount < minSize) {
timer.schedule(new FillTask(connectionInfo), 10);
}
if (selectOneAssumeMatch) {
connectionInfo.setManagedConnectionInfo(newMCI);
if (log.isLoggable(Level.FINEST)) {
log.log(Level.FINEST,"Supplying pooled connection without checking matching MCI: " + connectionInfo.getManagedConnectionInfo() + " MC: " + connectionInfo.getManagedConnectionInfo().getManagedConnection() + " from pool: " + this);
}
return;
}
ManagedConnection matchedMC;
try {
ManagedConnectionInfo mci = connectionInfo.getManagedConnectionInfo();
matchedMC = newMCI.getManagedConnectionFactory().matchManagedConnections(Collections.singleton(newMCI.getManagedConnection()),
mci.getSubject(),
mci.getConnectionRequestInfo());
} catch (ResourceException e) {
//something is wrong: destroy connection, rethrow, release permit
ConnectionInfo returnCI = new ConnectionInfo();
returnCI.setManagedConnectionInfo(newMCI);
returnConnection(returnCI, ConnectionReturnAction.DESTROY);
throw e;
}
if (matchedMC != null) {
connectionInfo.setManagedConnectionInfo(newMCI);
if (log.isLoggable(Level.FINEST)) {
log.log(Level.FINEST,"Supplying pooled connection MCI: " + connectionInfo.getManagedConnectionInfo() + " from pool: " + this);
}
} else {
//matching failed.
ConnectionInfo returnCI = new ConnectionInfo();
returnCI.setManagedConnectionInfo(newMCI);
returnConnection(returnCI, ConnectionReturnAction.RETURN_HANDLE);
throw new ResourceException("The pooling strategy does not match the MatchManagedConnections implementation. Please investigate and reconfigure this pool");
}
}
}