Problem with concurrence client
gozar Jun 4, 2006 2:11 PMI all,
i try to implement a sevice to booking a room.
I must to deploiy it on jboss 3.2.7 and i use CMT
The problem is when 2 client A, B call at same time booking method:
1)A: call "booking" with big Collection, order by date, include booking for tomorrow
2) A: call "verifyAvaibleBooking(bookingVO)" and nobody booking for tomorrow
3) B: call "booking" with only booking for tomorrow
A: continues to verifyAvaibleBooking
4) B call "verifyAvaibleBooking(bookingVO)" and nobody booking for tomorrow and create a booking for tomorrow
5) A: terminate to verifyAvaibleBooking and create booking
At the end of this computation i have 2 booking for tomorrow on the same room!
This is my bookingBean:
/* @ejb.bean name="Booking" display-name="Name for Booking" * description="Description for Booking" jndi-name="ejb/Booking" * local-jndi-name = "ejb/BookingLocal" type="CMP" cmp-version="2.x" * view-type="local" primkey-field = "id" * */ public abstract class BookingBean implements EntityBean { //every get method have this tag /** * Getter for CMP Field id * * @ejb.persistent-field * @ejb.interface-method view-type="local" * */ set...(); get...(); }
Now i have a Stateful antity bean to manage previews bean:
** * @ejb.bean name="ManageBooking" display-name="Name for ManageBooking" * description="Description for ManageBooking" * jndi-name="ejb/ManageBooking" type="Stateful" view-type="both" * * @ejb.resource-ref res-ref-name="jdbc/DefaultDS" * res-type="javax.sql.Datasource" * res-auth="Container" * *@jboss.resource-ref res-ref-name="jdbc/DefaultDS" * jndi-name="java:/DefaultDS" * * @jboss.container-configuration name="Standard Stateful SessionBean" * * @ejb.ejb-ref ejb-name="Booking" view-type="local" ref-name="ejb/BookingLocal" * * @ejb.ejb-ref ejb-name="User" view-type="local" ref-name="ejb/UserLocal" * * @ejb.ejb-ref ejb-name="ClassRoom" view-type="local" * ref-name="ejb/ClassRoomLocal" * * @ejb.ejb-ref ejb-name="Privilege" view-type="local" * ref-name="ejb/PrivilegeLocal" * * @ejb.ejb-ref ejb-name="MyConstraint" view-type="local" * ref-name="ejb/MyConstraintLocal" * */ public abstract class ManageBookingBean implements SessionBean{ //Define some variable /** * Sets the session context * @param javax.ejb.SessionContext the new ctx value * @ejb.method setSessionContext **/ public void setSessionContext(SessionContext ctx) throws EJBException, RemoteException { this.ctx = ctx; } /** * Unsets the session context * @param javax.ejb.SessionContext ctx value * @ejb.method unsetSessionContext */ public void unsetSessionContext() { this.ctx=null; } /** * Default create method * * @throws CreateException * @ejb.create-method */ public void ejbCreate() throws CreateException { try { userLocalHome = UserUtil.getLocalHome(); classRoomLocalHome = ClassRoomUtil.getLocalHome(); bookingLocalHome = BookingUtil.getLocalHome(); constraintLocalHome = MyConstraintUtil.getLocalHome(); } catch (NamingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //There are some (not transaction) method /** * Business method * * @ejb.interface-method view-type = "remote" * @ejb.transaction type = "Required" */ public String booking(Collection bookingVO) { ..... } }
This is a booking mathod:
/** * Business method * * @ejb.interface-method view-type = "remote" * @ejb.transaction type = "Required" */ public String booking(Collection bookingVO) { UserLocal userBean = null; ClassRoomLocal classRoomBean = null; Iterator iter; // Verifico la disponibilità Collection collBooking = verifyAvaibleBooking(bookingVO); if (collBooking.isEmpty()) { String tmp = computeConstraint(bookingVO); if (tmp.startsWith("Danied")) { return tmp; } iter = bookingVO.iterator(); while (iter.hasNext()) { BookingValue booking = (BookingValue) iter.next(); try { userBean = userLocalHome.findByPrimaryKey(booking.getUser() .getUserName()); classRoomBean = classRoomLocalHome.findByPrimaryKey(booking .getClassRoom().getName()); } catch (FinderException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { BookingLocal bookingBean = bookingLocalHome.create(); bookingBean.setBookingValue(booking); bookingBean.setClassRoom(classRoomBean); bookingBean.setUser(userBean); } catch (CreateException e) { Costanti.debug("Errore nella creazione delle prenotazione"); ctx.setRollbackOnly(); } } } else { return Costanti.DANIED_BOOKING + "<br>Impossibile effettuare la prenotazione" + "<br>Ci sono altre prenotazioni negli stessi orari e nelle stesse aule"; } return Costanti.OK_BOOKING + "<br>Prenotazione effettuata con successo"; }
How can I make to resolve this problem?
I know that i can use UserTransaction but i'm know that CMT make this for me!
Someone can say me because i have this problem?
Thanks for your help everyone