Hi All, I am facing the problem with transactions across remote JBoss servers. The scenario is like this:
I have a SLSB deployed on JBoss server A which is running on machine X and I have an Entity Bean deployed on JBoss server B which is running on machine Y. Now I am invoking one of the business methods on SLSB using the client program on machine X and which in turn look up the BMP Entity Bean on machine Y and inserts a row into the database. And the session bean inserts a row into the database on machine X with the same info. of the created row in database on machine Y. I am using the JTA API in Bean Managed SLSB to manage these database updates atomically. The problem is after the SLSB invoking the Entity Bean's create method, a new row is inserted into the database on machine X, but the JBoss server A throws the following exception and rolled back the transaction on machine Y's database. [TxInterceptorBMT] Application error: BMT stateless bean TestEJB should complete transactions before returning (ejb1.1 spec, 11.6.1) Please find the files I am using for reference: SLSB code: ------------- public int insertRow(String id) { Connection conn = null; UserTransaction ut = null; PreparedStatement pst = null; ResultSet rs = null; int result = 0; try { Properties prop = new Properties(); prop.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); prop.setProperty(Context.PROVIDER_URL, "jnp://remote-host:1099"); initCtx = new InitialContext(prop); ut = sessionCtx.getUserTransaction(); ut.begin(); AccountHome accHome = (AccountHome) PortableRemoteObject.narrow(initCtx.lookup("MyAccountHome"), AccountHome.class); Account account = accHome.create(id, 300); double amount = account.balance(); conn = getConnection(); pst = conn.prepareStatement("insert into test values(?,?)"); pst.setString(1, id); pst.setDouble(2, amount); result = pst.executeUpdate(); pst.close(); conn.close(); ut.commit(); } catch(Exception e) { try { pst.close(); conn.close(); ut.rollback(); } catch(SystemException se) { throw new EJBException("Rollback failed: " + se.getMessage()); } catch(SQLException se) { throw new EJBException("Rollback failed: " + se.getMessage()); } throw new EJBException("Transaction failed: " + e.getMessage()); } return result; } ejb-jar.xml: -------------- <?xml version="1.0"?> <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd"> <ejb-jar> <enterprise-beans> <ejb-name>TestEJB</ejb-name> com.abc.examples.TestHome com.abc.examples.Test <ejb-class>com.abc.examples.TestBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Bean</transaction-type> </enterprise-beans> </ejb-jar> jboss.xml: ------------ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 3.2//EN" "http://www.jboss.org/j2ee/dtd/jboss_3_2.dtd"> <enterprise-beans> <ejb-name>TestEJB</ejb-name> <jndi-name>MyTestHome</jndi-name> </enterprise-beans> Entity Bean code: -------------------- public String ejbCreate (String accountId, double initialBalance) throws CreateException { this.accountId = accountId; this.balance = initialBalance; Connection con = null; PreparedStatement ps = null; try { con = getConnection(); ps = con.prepareStatement("insert into ejbAccounts (id, bal) values(?, ?)"); ps.setString(1, accountId); ps.setDouble(2, balance); if (ps.executeUpdate() != 1) { throw new CreateException ("JDBC did not create any row"); } return accountId; } catch (SQLException sqe) { try { ejbFindByPrimaryKey(accountId); } catch(ObjectNotFoundException onfe) { throw new CreateException ("SQLException: " + sqe); } throw new DuplicateKeyException("An Account already exists in the database with Primary Key " + accountId); } finally { cleanup(con, ps); } } private Connection getConnection() throws SQLException { InitialContext initCtx = null; try { InitialContext ctx = new InitialContext(); DataSource ds = (javax.sql.DataSource) ctx.lookup("java:/DefaultDS"); return ds.getConnection(); } catch(NamingException ne) { throw new EJBException(ne); } finally { try { if(initCtx != null) initCtx.close(); } catch(NamingException ne) { throw new EJBException("Error closing context: " + ne); } } } ejb-jar.xml: -------------- <?xml version="1.0"?> <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd"> <ejb-jar> <enterprise-beans> <ejb-name>beanManaged</ejb-name> com.abc.transaction.beanmanaged.AccountHomecom.abc.transaction.beanmanaged.Account <ejb-class>com.abc.transaction.beanmanaged.AccountBean</ejb-class> <persistence-type>Bean</persistence-type> <prim-key-class>java.lang.String</prim-key-class> False <resource-ref> <res-ref-name>jdbc/DefaultDS</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> </enterprise-beans> <assembly-descriptor> <container-transaction> <ejb-name>beanManaged</ejb-name> <method-name>*</method-name> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor> </ejb-jar> How could I solve this problem? Any help is greatly appreciated as I am in the middle of the project. Thanks in advance. View the original post : http://www.jboss.org/index.html?module=bb&op=viewtopic&p=3842373#3842373 Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=3842373 ------------------------------------------------------- This SF.Net email is sponsored by BEA Weblogic Workshop FREE Java Enterprise J2EE developer tools! Get your free copy of BEA WebLogic Workshop 8.1 today. http://ads.osdn.com/?ad_id=4721&alloc_id=10040&op=click _______________________________________________ JBoss-Development mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/jboss-development