2017-07-20 3 views
0

Wie werde ich in einer Stateless Session Bean informiert, dass die Transaktion zurückgesetzt werden muss? Zum Beispiel habe ich eine zustandslose EJB, die einen LuceneIndex mit einigen Geschäftsdaten aktualisiert. Die Methode wird in einer Transaktion mit mehreren EJB-Aufrufen aufgerufen. Wenn einige der späteren EJBs die Transaktion rückgängig machen, wie kann ich dann über dieses Problem informiert werden, sodass ich meinen bereits geschriebenen LuceneIndex-Eintrag zurücksetzen kann?Wie macht man Stateless-Session-Beans transaktionsbewusst?

Antwort

1

Sie können dies tun, indem Sie einen Verweis auf den aktuellen EJBContext Injektion und dann die Abfrage:

@Stateless 
public class LuceneDriver { 

    @Resource 
    private EJBContext ejbContext; 

    public void performLuceneStuff(...) { 
     try { 
      ... 
      // update lucene data 
      ... 
      // update some business data 
      ... 
     } catch (BusinessException e) { 
      if (ejbContext.getRollbackOnly()) { 
       // rollback lucene changes 
      } 
     } 
    } 

    ... 

} 
+0

Aber was, wenn das Rollback von einem anderen EJB in derselben Transaktion nach meiner Methode performLuceneStuff() hat bereits fertig initialisiert wurde ? – Ralph

+1

Es spielt keine Rolle. EJBs waren immer sehr transaktionsbewusst. Der einzige Zeitpunkt, an dem 'ejbContext.getRollbackOnly()' nicht funktioniert, ist, wenn der andere EJB eine neue Transaktion gestartet hat. Eine neue Transaktion wurde nur gestartet, wenn Sie dies explizit konfiguriert haben. –

+0

Ich kann immer noch auf dem Schlauch stehen ... Was ich erwarte, ist ein Mechanismus zum Registrieren einer Callback-Methode, die vom Transaktionsmanager aufgerufen wird, wenn jemand anderes in der gleichen Transaktion (nicht meine Bean) fehlgeschlagen ist. Damit ich meine bereits geschriebenen Indexdateien rückgängig machen kann. – Ralph