Freigeben über


Variablenbereich in Orchestrierungen

Im Hinblick auf die Sichtbarkeit und den Status von Variablen und Orchestrierungsparametern an verschiedenen Stellen in der Orchestrierung, einschließlich der Ausnahmehandler und Kompensierungsblocks, sollten Sie sich einigen wichtigen Aspekte bewusst sein.

  • Orchestrierungsparameter sind im gesamten Textteil der Orchestrierung sowie in deren Kompensierungsblocks sichtbar.

  • Bereichsebenenvariablen sind im Textteil des Bereichs sowie in allen Ausnahmehandlern und Kompensierungsblocks sichtbar. Innerhalb von Ausnahmehandlern werden die Variablen als nicht initialisiert betrachtet, da nicht feststellbar ist, ob die Ausnahme, die zu einem bestimmten Handler geführt hat, vor oder nach der Initialisierung im Textteil stattfand. Deshalb können Sie eine Variable, die Sie in einem Bereich deklarieren und im Textteil initialisieren, in einem Ausnahmehandler nicht lesen, ohne einen Compilerfehler zu verursachen. Bei Transaktionen mit langer Laufzeit lässt sich dieses Problem umgehen. Im folgenden Beispiel wird gezeigt, wie Sie mithilfe des Operators "succeeded()" korrektes Laufzeitverhalten sicherstellen können:

    Hinweis

    Der folgende Code ist Pseudocode, der einen logischen Prozess beschreibt. Dieser Code kann nicht in einer Orchestrierungsform vom Typ "Ausdruck" verwendet werden.

    scope longrunning transaction L  
    {  
       System.Int32 i;  
       System.Int32 v;  
       body  
       {  
          i = 3;  
          scope longrunning transaction T  
          {  
             body  
             {  
                i = 5;  
             }  
          }  
       }  
       exceptions  
       {  
          catch  
          {  
             if(succeeded(T))  
             {  
                v = i;  // OK to read from it here — no compiler errors!  
             }  
          }  
       }  
    }  
    
  • Innerhalb eines Kompensierungsblocks übernehmen alle Variablen die Werte, die ihnen zugewiesen waren, als der Textteil des Bereichs festgeschrieben wurde. Beachten Sie, dass der Kompensierungsblock eines Bereichs nie sofort nach Abschluss des Textteils ausgeführt wird, da es stets dazwischen liegenden Code gibt. Werden durch dazwischen liegenden Code einige Variablen im äußeren Bereich aktualisiert, und wird dann der Kompensierungsblock ausgeführt, sind diese Aktualisierungen im Kompensierungsblock nicht sichtbar. Stattdessen werden die Variablen vorübergehend auf die Werte zurückgesetzt, die ihnen zu dem Zeitpunkt zugewiesen waren, zu dem der Bereich festgeschrieben wurde, der diese Kompensierung besitzt.

  • Ist eine Transaktion in einer Schleife geschachtelt, wird sie so oft kompensiert, wie die Schleife ausgeführt wird. Innerhalb des Kompensierungsblocks für jede Iteration übernehmen die Variablen im äußeren Bereich die Werte, die ihnen zum Zeitpunkt der Iteration der festgeschriebenen Transaktion zugewiesen waren.

  • Aktualisierungen der Variablen im äußeren Bereich oder Aktualisierungen der Orchestrierungsparameter innerhalb von Kompensierungsblocks innerer Bereiche sind erst nach Abschluss des Kompensierungsblocks sichtbar. Mit anderen Worten: Der Kompensierungsblock kann nicht zum direkten Ändern der Werte von Variablen im äußeren Bereich verwendet werden.

Weitere Informationen

XLANG-s-Datentypen