2016-06-22 28 views
2

ich mit den folgenden Technologien an einem Projekt arbeite: Java 1.8, EJB 3, JSF (Primefaces), Oracle, Weblogic 12.2.1Abbruch EJB Transaktion von JSF UI

Ich habe eine Schaltfläche "Speichern", die läuft eine zeitaufwendige EJB-Transaktion (lesen, aktualisieren, in Oracle schreiben).

Während die Methode ausgeführt wird, sieht der Benutzer einen modalen Dialog "Bitte warten" mit einer Schaltfläche "Abbrechen". Wie kann ich meine EJB-Transaktion abbrechen (explizites Rollback), wenn der Benutzer die Schaltfläche "Abbrechen" drückt, ohne die Benutzeroberfläche (Primefaces) zu entsperren?

Im Wesentlichen wie Rollback einer bereits laufenden Transaktion von einer anderen Methode? Die Transaktionen sind Container Managed Transactions.

Ein Ausschnitt aus meinem Code:

@Named 
@ViewScoped 
public class MyBean implements Serializable { 

    @Inject 
    private IFacade facade; 

    public String save() { 
     facade.save(); 
    } 

    public void abortSave() { 
     // Cancel save transaction. 
    } 

} 

@Stateless 
public class FacadeImpl implements IFacade { 

    @Override 
    public String save() { 
     // Transaction here, read, write, update DB. 
    } 

} 
+0

Wie wäre es mit http://docs.oracle.com/javaee/6/api/ javax/ejb/EJBContext.html # setRollbackOnly() – Amit

Antwort

0

kann ich nur eine Lösung vorstellen: Sie haben einige gemeinsame Objekt (Feld in verwalteten JSF Bean) mit flüchtigen Flag "isCancelled" (oder dieses gemeinsame Objekt kann AtomicBoolean sein).

Sie übergeben dieses Objekt als Parameter an IFacade.save() Methode. In Save-Methode können Sie abgebrochen Status überprüfen, wo Sie wollen und Rollback-Transaktion über EJBContext.setRollbackOnly().

-1

Ich kann nicht eine Transaktion initiiert, brechen aber was Sie tun können, ist eine neue Transaktion starten, um die Änderungen eliminiert Sie

gemacht
+0

Das würde bedeuten, ein eigenes Transaktionsprotokoll, einen Transaktionsmanager usw. zu erstellen ... das würde ich nicht versuchen. Und es würde immer noch nicht erreichen, eine Transaktion auf halbem Wege abzuwickeln/anzuhalten. Wenn Sie am Ende der Transaktion reagieren möchten, wie Sie vorschlagen, ist es einfacher, die Transaktion explizit rückgängig zu machen anstelle eines Commits – Kukeltje

+0

Erstellen Sie zu keinem Zeitpunkt ein Transaktionsprotokoll. und es ist nicht möglich (oder einfach), in eine CMT- oder BMT-Transaktion einzugreifen, weil EJB Thread-sicher ist –