Dear All,

I'm currently playing around with Jackrabbit's jca package and end up in some strange errors (which will mainly be due to wrong use from my code :-)). Here's my environment:
JBoss 4.0.5.GA
Java 1.5_06
Jackrabbit 1.3.1 (checked out and build tagged version)
jcr-ds.xml (only modified homeDir property - I experimented with both true and false for bindSessionToTransaction):
  <connection-factories>
   <tx-connection-factory>
       <jndi-name>jcr/local</jndi-name>
       <xa-transaction/>
       <rar-name>jackrabbit-jca-1.3.1.rar</rar-name>
       <connection-definition>javax.jcr.Repository</connection-definition>
<config-property name="homeDir" type="java.lang.String">${jboss.server.data.dir}${/}jackrabbit</config-property> <config-property name="configFile" type="java.lang.String">classpath:repository.xml</config-property> <config-property name="bindSessionToTransaction" type="java.lang.Boolean">false</config-property>
   </tx-connection-factory>
  </connection-factories>

Here's my client code:
XAResource xares = ((JCASessionHandle)session).getManagedConnection().getXAResource(); //xares is either of type org.apache.jackrabbit.core.XASessionImpl (if bindSessionToTransaction is set to false and org.apache.jackrabbit.jca.TransactionBoundXAResource if set to true)
   // create dummy Xid
Xid xid = new XidImpl(counter++); //XidImpl is simply copied from org.apache.jackrabbit.core.UserTransactionImpl ((org.apache.jackrabbit.core.XASessionImpl)xares).associate(null); //I think I shouldn't do that :-)
   xares.start(xid, XAResource.TMNOFLAGS);

// .... add new nodes & properties and save them Node root = session.getRootNode(); Node child = root.hasNode(path.getRelativePath()) ? root.getNode(path.getRelativePath()) : createFilePath(root, path.getPathParts(), path.getObjectName());
           FileTypeResolver ftr = FileTypeResolver.instantiate();
           child.setProperty("jcr:mimeType", ftr.getMIMEType(obj));
           child.setProperty("jcr:data", new FileInputStream(obj));
           Calendar rightNow = Calendar.getInstance();
           child.setProperty("jcr:lastModified", rightNow);
           //child.setProperty("original-file-name", obj.getName());
           session.save();

   xares.end(xid, XAResource.TMSUCCESS);
   xares.prepare(xid);
   xares.commit(xid, false);
If I set bindSessionToTransaction to false and disassociate the XAResource from it's transaction (calling associate(null)), I can start (and end and commit) the transaction successfully - I have however the strong feeling that I shouldn't do that :-) If I set bindSessionToTransaction to true (which would be the default) or if I do not disassociate the XAResource from it's transaction then I always get an exception thrown at XASessionImpl line 227 (remember that I'm working on 1.3.1).

I never found out why the XAResource was associated with a transaction although bindSessionToTransaction was set to false.

It would be great if someone could tell me what I'm doing wrong and/or point me to sample code that should work in my environment and/or tell me if she/he already did something similar successfully when deployed on JBoss.


many thanks,
Markus

Reply via email to