[jboss-user] [JCA] - AS400JDBCXADataSource - getting started with two txns

chris weddell do-not-reply at jboss.com
Wed Apr 14 10:24:22 EDT 2010


chris weddell [http://community.jboss.org/people/weddelc1] created the discussion

"AS400JDBCXADataSource - getting started with two txns"

To view the discussion, visit: http://community.jboss.org/message/537429#537429

--------------------------------------------------------------
Hi,

I am trying to get started with XA using JBOSS connected to two datasources (seperate applications) on the same AS400 (DB2) database.

I have two datasources (see attached) and have the following code...
UserTransaction utx;InitialContext initialContext = EquationCommonContext.getContext().getNamingInitialContext();try {utx = (UserTransaction) initialContext.lookup("UserTransaction"); DataSource dataSource1 = (DataSource) initialContext.lookup("EQ-EQ4"); DataSource dataSource2 = (DataSource) initialContext.lookup("EQ-EQ5"); // begin a trannie utx.begin();// .. Connection connection1 = dataSource1.getConnection();Statement statement1 = connection1.createStatement();statement1.execute("INSERT INTO KFILEQ4/JVPF (JVHRC, JVHRD) VALUES('E01', 'EEE')"); statement1.close();connection1.close();Connection connection2 = dataSource2.getConnection();Statement statement2 = connection2.createStatement();statement2.execute("INSERT INTO KFILEQ4/JVPF (JVHRC, JVHRD) VALUES('E02', 'EEE')"); statement2.close();connection2.close();// unfortunatelt the following line failsutx.commit();System.out.println(utx.getStatus()); }catch (Exception e) {e.printStackTrace();}

unfortunately I get the following error when i execute the commit....


14:53:50,076 INFO [STDOUT] Wed Apr 14 14:53:50:076 BST 2010 as400: XAResource B603382C-XA:RMID#49153 (30120272) : xa_end.
14:53:50,076 INFO [STDOUT] Wed Apr 14 14:53:50:076 BST 2010 as400: XAResource B603382C-XA:RMID#49153 (30120272) : xa error class = 0, return code = 0.
14:53:50,076 INFO [STDOUT] Wed Apr 14 14:53:50:076 BST 2010 as400: XAResource B603382C-XA:RMID#49153 (30120272) : xa_commit.
14:53:50,092 INFO [STDOUT] Wed Apr 14 14:53:50:092 BST 2010 as400: XAResource B603382C-XA:RMID#49153 (30120272) : xa error class = 9, return code = -6.
14:53:50,092 ERROR [STDERR]
javax.transaction.RollbackException: [com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted] [com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted] Could not commit transaction.14:53:50,092 ERROR [STDERR] at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(
TransactionImple.java:1426)14:53:50,092 ERROR [STDERR] at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(
BaseTransaction.java:135)14:53:50,092 ERROR [STDERR] at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(
BaseTransactionManagerDelegate.java:75)14:53:50,092 ERROR [STDERR] at org.jboss.tm.usertx.client.ServerVMClientUserTransaction.commit(
ServerVMClientUserTransaction.java:162)14:53:50,092 ERROR [STDERR] at com.misys.equation.ui.services.ServiceDirectory.startXATransaction(
ServiceDirectory.java:1156)14:53:50,092 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke0(
Native Method)14:53:50,092 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
14:53:50,092 ERROR [STDERR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
14:53:50,092 ERROR [STDERR] at java.lang.reflect.Method.invoke(Unknown Source)
14:53:50,092 ERROR [STDERR] at org.apache.axis.providers.java.RPCProvider.invokeMethod(
RPCProvider.java:397)14:53:50,092 ERROR [STDERR] at org.apache.axis.providers.java.RPCProvider.processMessage(
RPCProvider.java:186)14:53:50,092 ERROR [STDERR] at org.apache.axis.providers.java.JavaProvider.invoke(
JavaProvider.java:323)14:53:50,092 ERROR [STDERR] at org.apache.axis.strategies.InvocationStrategy.visit(
InvocationStrategy.java:32)14:53:50,092 ERROR [STDERR] at org.apache.axis.SimpleChain.doVisiting(
SimpleChain.java:118)14:53:50,092 ERROR [STDERR] at org.apache.axis.SimpleChain.invoke(
SimpleChain.java:83)14:53:50,092 ERROR [STDERR] at org.apache.axis.handlers.soap.SOAPService.invoke(
SOAPService.java:454)14:53:50,092 ERROR [STDERR] at org.apache.axis.server.AxisServer.invoke(
AxisServer.java:281)14:53:50,092 ERROR [STDERR] at org.apache.axis.transport.http.AxisServlet.doPost(
AxisServlet.java:699)14:53:50,092 ERROR [STDERR] at javax.servlet.http.HttpServlet.service(
HttpServlet.java:637)14:53:50,092 ERROR [STDERR] at org.apache.axis.transport.http.AxisServletBase.service(
AxisServletBase.java:327)14:53:50,092 ERROR [STDERR] at javax.servlet.http.HttpServlet.service(
HttpServlet.java:717)14:53:50,092 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
ApplicationFilterChain.java:290)14:53:50,092 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(
ApplicationFilterChain.java:206)14:53:50,092 ERROR [STDERR] at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(
ReplyHeaderFilter.java:96)14:53:50,092 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
ApplicationFilterChain.java:235)14:53:50,092 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(
ApplicationFilterChain.java:206)14:53:50,092 ERROR [STDERR] at org.apache.catalina.core.StandardWrapperValve.invoke(
StandardWrapperValve.java:235)14:53:50,092 ERROR [STDERR] at org.apache.catalina.core.StandardContextValve.invoke(
StandardContextValve.java:191)14:53:50,092 ERROR [STDERR] at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(
SecurityAssociationValve.java:190)14:53:50,092 ERROR [STDERR] at org.jboss.web.tomcat.security.JaccContextValve.invoke(
JaccContextValve.java:92)14:53:50,092 ERROR [STDERR] at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(
SecurityContextEstablishmentValve.java:126)14:53:50,092 ERROR [STDERR] at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(
SecurityContextEstablishmentValve.java:70)14:53:50,092 ERROR [STDERR] at org.apache.catalina.core.StandardHostValve.invoke(
StandardHostValve.java:127)14:53:50,092 ERROR [STDERR] at org.apache.catalina.valves.ErrorReportValve.invoke(
ErrorReportValve.java:102)14:53:50,092 ERROR [STDERR] at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(
CachedConnectionValve.java:158)14:53:50,092 ERROR [STDERR] at org.apache.catalina.core.StandardEngineValve.invoke(
StandardEngineValve.java:109)14:53:50,092 ERROR [STDERR] at org.apache.catalina.connector.CoyoteAdapter.service(
CoyoteAdapter.java:330)14:53:50,092 ERROR [STDERR] at org.apache.coyote.http11.Http11Processor.process(
Http11Processor.java:829)14:53:50,092 ERROR [STDERR] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(
Http11Protocol.java:601)14:53:50,092 ERROR [STDERR] at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(
JIoEndpoint.java:447)14:53:50,092 ERROR http://community.jboss.org/message/537429#537429/STDERR at java.lang.Thread.run(Unknown Source)











































Now when i run the following code I don't get a problem....

package com.misys.equation.common.test.connectivity;
import java.io.Serializable;import java.sql.Connection;import java.sql.SQLException;import java.sql.Statement;import java.util.Arrays;import java.util.Random;
import javax.sql.XAConnection;import javax.transaction.xa.XAException;import javax.transaction.xa.XAResource;import javax.transaction.xa.Xid;
import com.ibm.as400.access.AS400JDBCXADataSource;import com.ibm.as400.access.AS400JDBCXAResource;import com.misys.equation.common.utilities.Toolbox;
public class XATest{ // This attribute is used to store cvs version information. public static final String _revision = "$Id: FileProcessor.java,v 1.6 2009/09/16 16:13:27 esther.williams Exp $"; String user1 = "whatever"; String password1 = "itmaybe"; String system1 = "machineA"; String user2 = "whatever"; String password2 = "itmaybe"; String system2 = "machineA"; String library = "*LIBL"; AS400JDBCXADataSource xaDataSource1 = null; XAConnection xaConnection1 = null; XAResource xaResource1 = null; XidImpl xid = null; Connection connection1 = null; Statement statement1 = null; AS400JDBCXADataSource xaDataSource2 = null; XAConnection xaConnection2 = null; XAResource xaResource2 = null; AS400JDBCXAResource a; // XidImpl xid2 = null; Connection connection2 = null; Statement statement2 = null;
 private XATest() { }
 public static void main(String[] args) {  System.out.println("Proceeding with test...");  XATest test = new XATest();  test.test(); }
 private void test() {  try  {   xaDataSource1 = new AS400JDBCXADataSource();   xaDataSource1.setServerName(system1);   xaDataSource1.setUser(user1);   xaDataSource1.setPassword(password1);   xaDataSource1.setLibraries(library);   xaDataSource1.setNaming("system");   xaDataSource1.setTranslateBinary(false);   xaDataSource1.setTrace(true);
   xaDataSource2 = new AS400JDBCXADataSource();   xaDataSource2.setServerName(system2);   xaDataSource2.setUser(user2);   xaDataSource2.setPassword(password2);   xaDataSource2.setLibraries(library);   xaDataSource2.setNaming("system");   xaDataSource2.setTranslateBinary(false);   xaDataSource2.setTrace(true);
   xaConnection1 = xaDataSource1.getXAConnection();   xaConnection2 = xaDataSource2.getXAConnection();
   xaResource1 = xaConnection1.getXAResource();   xaResource2 = xaConnection2.getXAResource();
   xid = new XidImpl(new byte[] { 0x0d }, new byte[] );
   xaResource1.start(xid, XAResource.TMNOFLAGS);
   // Need to decide whether to join based on whether the resources have the same resource manager   // if the are the same then the prepares, commits and rollbacks should only be executed on   // the first resource   if (xaResource1.isSameRM(xaResource2))   {    xaResource2.start(xid, XAResource.TMJOIN);   }   else   {    xaResource2.start(xid, XAResource.TMNOFLAGS);   }
   // Do some SQL on connection 1   connection1 = xaConnection1.getConnection();   statement1 = connection1.createStatement();   statement1.executeUpdate("INSERT INTO KFILEQ4/JVPF (JVHRC, JVHRD) VALUES('X01', 'X01D')");
   // Do some SQL on connection 2   connection2 = xaConnection2.getConnection();   statement2 = connection2.createStatement();   statement2.executeUpdate("INSERT INTO KFILEQ4/JVPF (JVHRC, JVHRD) VALUES('X02', 'X02D')");
   // tell the resources that we have successfully finished doing the work,   // need to consider what to do if the SQL had gone wrong!   xaResource1.end(xid, XAResource.TMSUCCESS);   xaResource2.end(xid, XAResource.TMSUCCESS);
   if (xaResource1.isSameRM(xaResource2))   {    // only need to prepare on the first resource    int ret1 = xaResource1.prepare(xid);    // int ret2 = xaResource2.prepare(xid);        // only need to commit on the first resource    xaResource1.commit(xid, false);    // xaResource2.commit(xid, false);   }   else   {    int ret1 = xaResource1.prepare(xid);    int ret2 = xaResource2.prepare(xid);    xaResource1.commit(xid, false);    xaResource2.commit(xid, false);   }  }  catch (XAException e)  {   e.printStackTrace();  }  catch (SQLException e)  {   e.printStackTrace();  }  finally  {   try   {    statement1.close();    statement2.close();    connection1.close();    connection2.close();    xaConnection1.close();    xaConnection2.close();   }   catch (Exception e2)   {    // TODO: handle exception   }  } } public static class XidImpl implements Serializable, Xid {  private static final long serialVersionUID = 1L;  private static Random random = new Random();  private final int formatId = 876;  private final byte[] globalTransactionId;  private final byte[] branchQualifier;  private transient String cachedToString;  private transient int cachedHashCode;
  public XidImpl()  {   globalTransactionId = new byte[10];   random.nextBytes(globalTransactionId);   branchQualifier = new byte[10];   random.nextBytes(branchQualifier);  }  public XidImpl(byte[] globalTransactionId, byte[] branchQualifier)  {   this.globalTransactionId = globalTransactionId;   this.branchQualifier = branchQualifier;  }
  public int getFormatId()  {   return formatId;  }
  public byte[] getGlobalTransactionId()  {   return globalTransactionId;  }
  public byte[] getBranchQualifier()  {   return branchQualifier;  }
  @Override  public boolean equals(Object object)  {   if (object == this)    return true;   if (object == null || object instanceof Xid == false)    return false;
   Xid other = (Xid) object;   return (formatId == other.getFormatId() && Arrays.equals(globalTransactionId, other.getGlobalTransactionId()) && Arrays       .equals(branchQualifier, other.getBranchQualifier()));  }
  @Override  public int hashCode()  {   if (cachedHashCode == 0)   {    cachedHashCode = formatId;    for (int j = 0; j < globalTransactionId.length; ++j)     cachedHashCode += globalTransactionId[j];   }   return cachedHashCode;  }
  @Override  public String toString()  {   if (cachedToString == null)   {    StringBuffer buffer = new StringBuffer();    buffer.append("XidImpl[FormatId=").append(getFormatId());    buffer.append(" GlobalId=x'").append(Toolbox.cvtBytesToHexString(getGlobalTransactionId()));    buffer.append("' BranchQual=x'").append(Toolbox.cvtBytesToHexString(getBranchQualifier()));    buffer.append("']");    cachedToString = buffer.toString();   }   return cachedToString;  } }}


Note there is an extra "end" for the secound resource and a "prepare" that i don't see logged in the jboss example. 

Any ideas?

--------------------------------------------------------------

Reply to this message by going to Community
[http://community.jboss.org/message/537429#537429]

Start a new discussion in JCA at Community
[http://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2098]

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/jboss-user/attachments/20100414/92f3ff51/attachment.html 


More information about the jboss-user mailing list