Code pour la méthode deposer de l'EJB :
/** * Déposer un montant sur un compte. Version qui tient compte de la * concurrence. */ public void deposer(CompteBancaire compte, int montant) { int solde = compte.getSolde(); boolean concurrence = false; compte = em.find(CompteBancaire.class, compte.getId(), LockModeType.PESSIMISTIC_WRITE); if (solde != compte.getSolde()) { // le solde a été modifié ; il faut avertir l'utilisateur concurrence = true; } compte.deposer(montant); update(compte); if (concurrence) { // le solde a été modifié ; il faut avertir l'utilisateur throw new ConcurrentAccessException("Dépôt effectué mais le solde a été modifié concurremment"); } }
Code similaire pour la méthode retirer
.
Code pour le backing bean :
public String enregistrerMouvement() { try { if (typeMouvement.equals("ajout")) { try { gestionnaireCompte.deposer(compte, montant); } catch(ConcurrentAccessException ex) { Util.addFlashErrorMessage(ex.getMessage()); } ...
La classe d'exception :
import javax.ejb.ApplicationException; /** * Exception lancée en cas d'accès concurrent sans gravité. */ @ApplicationException(rollback = false) public class ConcurrentAccessException extends RuntimeException { public ConcurrentAccessException(String message) { super(message); } }