I am trying to use enhydra's connection pool/XA support for our
project. It's a ServiceMix-based project, so we're using Aries'
"wrapper" around Geronimo's transaction manager. Anyway, what I'm
seeing is that their XA code seems to be trying to re-enlist the same
connection. Unfortunately, they re-use the same XAResource instance,
so I run into this bit of code causing me an error:
if (xaRes == manager.getCommitter()) {
throw new IllegalStateException("xaRes " + xaRes + " is a committer
but is not active or suspended");
}
Their connection code looks like this:
public class StandardXAConnection
extends StandardPooledConnection
implements XAConnection, XAResource, Referenceable, Runnable {
...
/**
* We are required to maintain a 1-1 mapping between an XAConnection
* and its corresponding XAResource. We achieve this by implementing
* both interfaces in the same class.
*/
public XAResource getXAResource() {
return this;
}
}
What I'm trying to understand is if they're attempting to do something
silly here or if I have something mis-configured. We're using OpenJPA
and when it goes to close the connection (after it uses it for a
query), enhydra delists it from the current transaction. Inside their
DataSource's "connectionClosed" method:
if ((tx != null) && (((StandardXAConnection)
xac).connectionHandle.isReallyUsed)) {
try {
tx.delistResource(xac.getXAResource(), XAResource.TMSUCCESS);
// delist the xaResource
log.debug(
"StandardXAPoolDataSource:connectionClosed the resourse is
delisted");
} catch (Exception e) {
log.error(
"StandardXAPoolDataSource:connectionClosed Exception in
connectionClosed:"
+ e);
}
}
Does this all make sense? Is there something I need to configure to
allow re-enlistment of resources or are they just doing something
bone-headed here?