Hi,
I'm trying to use jackrabbit with JTA in Spring. For now, I wrote a
simple AOP on top of all methods that must run in separate transactions.
I reuse session after each transaction, and the code below works:
public Object invoke(MethodInvocation methodInvocation) throws Throwable
{
Session currentSession = sessionManager.getSessionForCurrentContext();
if (!(currentSession instanceof XASession)) {
return methodInvocation.proceed();
}
XASession session = (XASession) currentSession;
XAResource xaResource = session.getXAResource();
final byte[] branchQualifier = new byte[8];
final byte[] globalTransactionId = new byte[8];
random.nextBytes(branchQualifier); // create random id
random.nextBytes(globalTransactionId);
Xid xid = new Xid() {
public byte[] getBranchQualifier() {
return branchQualifier;
}
public int getFormatId() {
return 0;
}
public byte[] getGlobalTransactionId() {
return globalTransactionId;
}
};
try {
xaResource.start(xid, XAResource.TMNOFLAGS);
Object retValue = methodInvocation.proceed();
xaResource.end(xid, XAResource.TMSUCCESS);
xaResource.prepare(xid);
xaResource.commit(xid, false);
return retValue;
} catch (XAException e) {
throw new RuntimeException("Cannot commit transacion.", e);
} catch (Throwable e) {
xaResource.end(xid, XAResource.TMFAIL);
xaResource.prepare(xid);
xaResource.rollback(xid);
throw e;
}
}
It works, but I would like to have transactions managed declaratively in
Spring configuration. In this case I need (do I?) to extend/use Spring's
JtaTransactionManager... How to do it? Maybe someone has done it
already?
Cheers,
Marcin