Frage

Mit EJB3.0, Weblogic 11g, JDBC

Ich berufe eine Methode, die in einem anderen Bereitstellungsohr aus der Ferne ausgeführt wird.

Die Methode in der Remote -Bereitstellung, die aufgerufen wird, ist jedoch mit dem kommentiert@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

Das Problem ist, dass die gesamte Logik, die ich in der Datenbank mache, bevor die Remote -Methode aufgerufen wird, wird nicht bestritten, bis die Remote -Methode beendet ist.

Was ich tun möchte, ist ein Verpflichtung, die "vor" Logik stattfinden "und wenn ich nach dem Remote -Anruf zurückkomme, um normal fortzufahren.

Irgendeine Idee?

Ein Code zum Erklären:

@CallByReference
@Stateless(mappedName = "ejb/OperatorProccessBean")
@Local({ OperatorProccessBeanLocal.class })
@Remote({ OperatorProccessBeanRemote.class })
public class OperatorProccessBean implements OperatorProccessBeanLocal,  
 OperatorProccessBeanRemote
{   

...

   SBNDispatchBeanRemote SBNDispatchBean = (SBNDispatchBeanRemote) context.lookup("ejb/SBNDispatchBean#com.mirs.sbn.dispatch.SBNDispatchBeanRemote");
    if (SBNDispatchBean == null)
    {
            logger.error(TAG + " SBNDispatchBean is null");

    }
    else
    {
         //until here I want all my data to be commited without waiting for the upcoming remote method to finish
         SBNDispatchBean.updateSubscriberInBlockingList(...);
    }
...
 }

Jetzt die Methode updateSubscriberInBlockingList() wird mit Annotiert mit

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

Ich möchte, dass die Daten vor dieser Methode begangen werden.

Danke im Voraus, Ray.

War es hilfreich?

Lösung

Jetzt ist die Methode updatesUbscriberinBlockingList () mit @transactionAttribute (TransactionAttribUtetype.Requires_New) kommentiert.

Ich möchte, dass die Daten vor dieser Methode begangen werden.

Angesichts der Tatsache, dass Sie Container -Managed -Transaktionen verwenden, ist dies nicht möglich. Die Begründung dahinter ist, dass bei der Durchführung des Containers eine Transaktion bereits eine neue Transaktion dazu führt, dass das Original suspendiert wird. Wenn die neue Transaktion begangen wurde, wird die ursprüngliche Transaktion wieder aufgenommen.

Dieses Verhalten ist nicht konfigurierbar für den EJB -Container, und der JTA -Transaktionsmanager wird erwartet, dass das in der JTA -Spezifikation angegebene Verhalten, das aus dem X/Open -DTP -Transaktionsmodell abgeleitet wird, enthält. Wenn im X/Open -DTP -Modell eine neue Transaktion gestartet wird, während ein weiterer im Gange ist, wird der aktuelle und zu einem späteren Zeitpunkt wieder aufgenommen. Es ist zu beachten, dass kein Transaktionsmodell, würde vielleicht (Ich habe nicht alle studiert) Erlauben Sie, die aktuelle Transaktion zu begehen und eine neue zu starten. Ich habe nur verschachtelte Transaktionen oder suspendierte Transaktionen gesehen, die in den verschiedenen Transaktionsverarbeitungsmodellen unterstützt wurden.

Wenn Sie die Arbeit begangen haben möchten, müssen Sie den vorhandenen Transaktionskontext vollständig beenden, damit die vorhandene Transaktion festgelegt und dann die neue Transaktion starten wird.

Andere Tipps

Legen Sie die Logik "Before Remote Call" in eine separate Bean -Methode ein, die auch mit Bedarf_New kommentiert ist. Sie werden also drei Transaktionen haben:

  • eine für die Hauptmethode (die jedoch nichts bewirkt, wenn der Fernruf ausgeführt wird);
  • eine für die Logik vor dem Fernruf;
  • eine für den Remote -Anruf.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top