Eric Chang wrote:
> 
> hello,
> 
> I have encountered the following distributed transaction problem using the
> following configuration (jonas 2.3):
> 
> I am using an entity bean that represents a user (bean-managed persistence,
> container-managed transactions), with the following deployment descriptor:
> 
>         <enterprise-bean>
>                 <entity>
>                         <ejb-name>User</ejb-name>
>                         <persistence-type>Bean</persistence-type>
>                         ...
>                 </entity>
>         </enterprise-bean>
>         ...
>         <assembly-descriptor>
>                 <container-transaction>
>                         <method>
>                                 <ejb-name>User</ejb-name>
>                                 <method-name>*</method-name>
>                         </method>
>                         <trans-attribute>Required</trans-attribute>
>                 </container-transaction>
>         </assembly-descriptor>
> 
> There is also a UserManager stateless session bean (bean-managed
> transactions) that provides a facade to the User bean:
> 
>         <enterprise-bean>
>                 <session>
>                         <ejb-name>UserManager</ejb-name>
>                         <session-type>Stateless</session-type>
>                         <transaction-type>Bean</transaction-type>
>                         ...
>                 </session>
>         </enterprise-bean>
> 
> The User Bean and the UserManager Bean operate in two separate jonas servers
> on two separate machines, with separate JEREMIE registries and local
> Transaction Managers (jonas.tm.remote = false).  The User Bean is running in
> the "Jonas-User" server and the UserManager Bean is running in the
> "Jonas-UserManager" server.
I don't think that you should use such a configuration.
Using Jeremie, you should be able to run only 1 registry, because the jeremie
registry can work on several hosts (it's not the case with RMI!)
Also for the JTM, you should have only 1 JTM registered in your registry.
HAving 2 JTM may cause problems if you want to use distributed transactions.
In other words, each transaction must be handled by only 1 JTM.
So, you should try to run only 1 EJBServer with jonas.tm.remote = false, and
all others with jonas.tm.remote = true.
Beside this, I found a little bug in jonas that lead to message:
"cannot make interposition, ...". I will fix it in the current CVS version,
but this is not your main issue here. Note that in the current release of
JOnAS property names have changed : jonas.tm.remote is now jonas.service.jtm.remote
I hope this will help...
        Philippe
> 
> The User Bean's ejbStore() method modifies the database programmatically.
> There is also a method, changeUser(..), that allows a client of the User
> Bean to change the internal values of the Bean.  The UserManager Bean calls
> User.changeUser() within a bean-managed transaction:
> 
> UserManagerBean.java:
> 
>         public void changeUser(..)
> 
>                 ...
>                 try {
>                         javax.transaction.UserTransaction trans =
> this.sessionContext.getUserTransaction();
>                         User user = userHome.findByPrimaryKey(userId);
> 
>                         trans.begin();
>                         ...
>                         user.changeUser(..);
>                         ...
>                         trans.commit;
>                         System.out.println("Transaction commmited");
>                         return;
>                 } catch (Exception e) {
>                         try {
>                                 trans.rollback;
>                         } catch (Exception e2) { }
>                 }
>         }
> 
> (Once again, the User is running in the jonas named "JonasUser" and the
> UserManager is in the jonas container "JonasUserManager")
> Since the <trans-attribute> on the method User.changeUser(..) is "Required",
> I expect the User.changeUser() method to use the existing transaction
> ("trans") explicity declared in the code above.  In other words, the call to
> trans.commit() should cause the "JonasUser" container to call
> User.ejbStore() after User.changeUser() has modified the entity bean's
> state.  However, I've found that when an exception is thrown in
> User.ejbStore() -- say an SQLException due to an errant database
> operation -- the demarcated transaction in the UserManager Bean code above
> commits without throwing an exception, and at some point after the calling
> method UserManagerBean.changeUser() returns, I get the following exception:
> 
>  JContextEntity.storeIfModified raised EJBException
>  Rollback during beforeCompletion in SubCoordinator.prepare
>  Resource replied rollback to prepare
>  JTM: Cannot rollback resource:
> java.rmi.MarshalException: error during marshalling/unmarshalling by stub;
> nested exception is:
>         org.omg.CORBA.OBJECT_NOT_EXIST:   minor code: 0  completed: No
> org.omg.CORBA.OBJECT_NOT_EXIST:   minor code: 0  completed: No
>         at java.lang.Class.newInstance0(Native Method)
>         at java.lang.Class.newInstance(Class.java:237)
>         at
> org.objectweb.david.libs.protocols.giop.GIOPProtocol$ReplyHolder.listen(GIOP
> Protocol.java:933)
>         at
> org.objectweb.jonas_tm.SubCoordinator_Stub.rollback(SubCoordinator_Stub.java
> :176)
>         at
> org.objectweb.jonas_tm.ControlImpl.do_rollback(ControlImpl.java:911)
>         at org.objectweb.jonas_tm.ControlImpl.commit(ControlImpl.java:425)
>         at
> org.objectweb.jonas_tm.ControlImpl_Skel.send(ControlImpl_Skel.java:51)
>         at
> org.objectweb.david.libs.protocols.giop.GIOPProtocol$ServerSession_Low.send(
> GIOPProtocol.java:621)
>         at
> org.objectweb.jonathan.libs.protocols.tcpip.TcpIpProtocol$Session.run(TcpIpP
> rotocol.java:396)
>         at
> org.objectweb.jonathan.libs.resources.JScheduler$JJob.run(JScheduler.java:26
> 5)
> 
> It appears that by the time the container calls User.ejbStore(), the
> original transaction has been committed and cleaned up.  However, if i
> modify the UserManager Bean deployment descriptor to use Container-managed
> transactions:
> 
>         <enterprise-bean>
>                 <session>
>                         <ejb-name>UserManager</ejb-name>
>                         <session-type>Stateless</session-type>
>                         <transaction-type>Container</transaction-type>
>                         ...
>                 </session>
>         </enterprise-bean>
>         <assembly-descriptor>
>                 <container-transaction>
>                         <method>
>                                 <ejb-name>UserManager</ejb-name>
>                                 <method-name>changeUser</method-name>
>                         </method>
>                         <trans-attribute>Required</trans-attribute>
>                 </container-transaction>
>         </assembly-descriptor>
> 
> and i remove the demarcated transations from UserManagerBean.changeUser(),
> things seem to work correctly.  That is, if User.ejbStore() throws an
> exception, i get the following output:
> 
>  JContextEntity.storeIfModified raised EJBException
>  Rollback during beforeCompletion in SubCoordinator.commit_one_phase
>  Commit local transaction -> rolled back!
> 
> Is this difference in bean-managed and container-managed transactions
> expected?
> 
> Thanks for your help,
> 
> Eric

-- 
Philippe Durieux  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Bull - 1 rue de Provence - 38432 Echirolles Cedex France
[EMAIL PROTECTED]
-> Download our EJBServer at http://www.evidian.com/ejb <-
----
To unsubscribe, send email to [EMAIL PROTECTED] and
include in the body of the message "unsubscribe jonas-users".
For general help, send email to [EMAIL PROTECTED] and
include in the body of the message "help".

Reply via email to