Sdílet prostřednictvím


Compensator Třída

Definice

Představuje základní třídu pro všechny kompenzační Resource Manager (CRM) kompenzátory.

public ref class Compensator : System::EnterpriseServices::ServicedComponent
public class Compensator : System.EnterpriseServices.ServicedComponent
type Compensator = class
    inherit ServicedComponent
Public Class Compensator
Inherits ServicedComponent
Dědičnost

Příklady

Následující příklad kódu ukazuje použití této třídy.

// A CRM Compensator
public ref class AccountCompensator : public Compensator
{
private:
    bool receivedPrepareRecord;

public:
    AccountCompensator()
    {
        receivedPrepareRecord = false;
    } 

public:
    virtual void BeginPrepare() override 
    {
        // nothing to do
    }

public:
    virtual bool PrepareRecord(LogRecord^ log) override 
    {

        // Check the validity of the record.
        if (log == nullptr)
        {
            return false;
        }
        array<Object^>^ record = dynamic_cast<array<Object^>^>(log->Record);
        if (record == nullptr)
        {
            return false;
        }
        if (record->Length != 2)
        {
            return false;
        }

        // The record is valid.
        receivedPrepareRecord = true;
        return true;              
    }

public:
    virtual bool EndPrepare() override
    {
        // Allow the transaction to proceed onlyif we have received a prepare
        // record.
        if (receivedPrepareRecord)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

public:
    virtual void BeginCommit(bool commit) override
    {
        // nothing to do
    }

public:
    virtual bool CommitRecord(LogRecord^ log) override
    {
        // nothing to do
        return(false);
    }

public:
    virtual void EndCommit() override
    {
        // nothing to do
    }

public:
    virtual void BeginAbort(bool abort) override
    {
        // nothing to do
    }

public:
    virtual bool AbortRecord(LogRecord^ log) override
    {

        // Check the validity of the record.
        if (log == nullptr)
        {
            return true;
        }
        array<Object^>^ record = dynamic_cast<array<Object^>^>(log->Record);
        if (record == nullptr)
        {
            return true;
        }
        if (record->Length != 2)
        {
            return true;
        }

        // Extract old account data from the record.
        String^ filename = (String^) record[0];
        int balance = (int) record[1];

        // Restore the old state of the account.
        WriteAccountBalance(filename, balance);

        return false;
    }

public:
    virtual void EndAbort() override
    {
        // nothing to do
    }    

};
// A CRM Compensator
public class AccountCompensator : Compensator
{

    private bool receivedPrepareRecord = false;

    public override void BeginPrepare ()
    {
        // nothing to do
    }

    public override bool PrepareRecord (LogRecord log)
    {

        // Check the validity of the record.
        if (log == null) return(true);
        Object[] record = log.Record as Object[];
        if (record == null) return(true);
        if (record.Length != 2) return(true);

        // The record is valid.
        receivedPrepareRecord = true;
        return(false);
    }

    public override bool EndPrepare ()
    {
        // Allow the transaction to proceed onlyif we have received a prepare record.
        if (receivedPrepareRecord)
        {
            return(true);
        }
        else
        {
            return(false);
        }
    }

    public override void BeginCommit (bool commit)
    {
        // nothing to do
    }

    public override bool CommitRecord (LogRecord log)
    {
        // nothing to do
        return(false);
    }

    public override void EndCommit ()
    {
        // nothing to do
    }

    public override void BeginAbort (bool abort)
    {
        // nothing to do
    }

    public override bool AbortRecord (LogRecord log)
    {

        // Check the validity of the record.
        if (log == null) return(true);
        Object[] record = log.Record as Object[];
        if (record == null) return(true);
        if (record.Length != 2) return(true);

        // Extract old account data from the record.
        string filename = (string) record[0];
        int balance = (int) record[1];

        // Restore the old state of the account.
        AccountManager.WriteAccountBalance(filename, balance);

        return(false);
    }

    public override void EndAbort ()
    {
        // nothing to do
    }
}
' A CRM Compensator

Public Class AccountCompensator
    Inherits Compensator
    
    Private receivedPrepareRecord As Boolean = False
    
    
    Public Overrides Sub BeginPrepare() 
    
    End Sub
    
    ' nothing to do
    Public Overrides Function PrepareRecord(ByVal log As LogRecord) As Boolean 
        
        ' Check the validity of the record.
        If log Is Nothing Then
            Return True
        End If
        Dim record As [Object]() = log.Record
        
        If record Is Nothing Then
            Return True
        End If
        If record.Length <> 2 Then
            Return True
        End If 
        ' The record is valid.
        receivedPrepareRecord = True
        Return False
    
    End Function 'PrepareRecord
    
    Public Overrides Function EndPrepare() As Boolean 
        ' Allow the transaction to proceed onlyif we have received a prepare record.
        If receivedPrepareRecord Then
            Return True
        Else
            Return False
        End If
    
    End Function 'EndPrepare
    
    Public Overrides Sub BeginCommit(ByVal commit As Boolean) 
    
    End Sub
    
    ' nothing to do
    Public Overrides Function CommitRecord(ByVal log As LogRecord) As Boolean 
        ' nothing to do
        Return False
    
    End Function 'CommitRecord
    
    Public Overrides Sub EndCommit() 
    
    End Sub
    
    ' nothing to do
    Public Overrides Sub BeginAbort(ByVal abort As Boolean) 
    
    End Sub
    
    ' nothing to do
    Public Overrides Function AbortRecord(ByVal log As LogRecord) As Boolean 
        
        ' Check the validity of the record.
        If log Is Nothing Then
            Return True
        End If
        Dim record As [Object]() = log.Record
        
        If record Is Nothing Then
            Return True
        End If
        If record.Length <> 2 Then
            Return True
        End If 
        ' Extract old account data from the record.
        Dim filename As String = CStr(record(0))
        Dim balance As Integer = Fix(record(1))
        
        ' Restore the old state of the account.
        AccountManager.WriteAccountBalance(filename, balance)
        
        Return False
    
    End Function 'AbortRecord
    
    Public Overrides Sub EndAbort() 
    
    End Sub
End Class

Tento kompenzátor používá následující třída pracovního procesu.

// A CRM Worker
[Transaction]
public ref class Account : public ServicedComponent
{

    // A data member for the account file name.
private:
    String^ filenameValue;

public:
    property String^ Filename
    {
        String^ get()
        {
            return filenameValue;
        }
        void set( String^ value )
        {
            filenameValue = value;
        }
    }

    // A boolean data member that determines whether to commit or abort the 
    // transaction.
private:
    bool allowCommitValue;

public:
    property bool AllowCommit
    {
        bool get()
        {
            return allowCommitValue;
        }
        void set( bool value )
        {
            allowCommitValue = value;
        }
    }

    // Debit the account, 
public:
    void DebitAccount(int amount)
    {

        // Create a new clerk using the AccountCompensator class.
        Clerk^ clerk = gcnew Clerk(AccountCompensator::typeid,
            "An account transaction compensator", CompensatorOptions::AllPhases);

        // Create a record of previous account status, and deliver it to the
        // clerk.
        int balance = ReadAccountBalance(Filename);

        array<Object^>^ record = gcnew array<Object^>(2);
        record[0] = Filename;
        record[1] = balance;

        clerk->WriteLogRecord(record);
        clerk->ForceLog();

        // Perform the transaction
        balance -= amount;

        Console::WriteLine("{0}: {1}", Filename, balance);

        WriteAccountBalance(Filename, balance);

        // Commit or abort the transaction 
        if (AllowCommit)
        {
            ContextUtil::SetComplete();
        }
        else
        {
            ContextUtil::SetAbort();
        }

    }

};
// A CRM Worker
[Transaction]
public class Account : ServicedComponent
{

    // A data member for the account file name.
    private string filename;

    public string Filename
    {
        get
        {
            return(filename);
        }
        set
        {
            filename = value;
        }
    }

    // A boolean data member that determines whether to commit or abort the transaction.
    private bool commit;

    public bool AllowCommit
    {
        get
        {
            return(commit);
        }
        set
        {
            commit = value;
        }
    }

    // Debit the account,
    public void DebitAccount (int ammount)
    {

        // Create a new clerk using the AccountCompensator class.
        Clerk clerk = new Clerk(typeof(AccountCompensator),
          "An account transaction compensator", CompensatorOptions.AllPhases);

        // Create a record of previous account status, and deliver it to the clerk.
        int balance = AccountManager.ReadAccountBalance(filename);

    Object[] record = new Object[2];
    record[0] = filename;
        record[1] = balance;

        clerk.WriteLogRecord(record);
        clerk.ForceLog();

        // Perform the transaction
        balance -= ammount;
        AccountManager.WriteAccountBalance(filename, balance);

        // Commit or abort the transaction
        if (commit)
        {
            ContextUtil.SetComplete();
        }
        else
        {
            ContextUtil.SetAbort();
        }
    }
}
' A CRM Worker
<Transaction()>  _
Public Class Account
    Inherits ServicedComponent
    
    ' A data member for the account file name.
    Private filename As String
    
    
    Public Property Filenam() As String
        Get
            Return Filename
        End Get
        Set(ByVal value As String)
            filename = Value
        End Set
    End Property
    
    
    ' A boolean data member that determines whether to commit or abort the transaction.
    Private commit As Boolean
    
    
    Public Property AllowCommit() As Boolean 
        Get
            Return commit
        End Get
        Set
            commit = value
        End Set
    End Property
    
    
    
    
    ' Debit the account, 
    Public Sub DebitAccount(ByVal ammount As Integer) 
        
        ' Create a new clerk using the AccountCompensator class.
        Dim clerk As New Clerk(GetType(AccountCompensator), "An account transaction compensator", CompensatorOptions.AllPhases)
        ' Create a record of previous account status, and deliver it to the clerk.
        Dim balance As Integer = AccountManager.ReadAccountBalance(Filenam)
        
        Dim record(1) As [Object]
        record(0) = filename
        record(1) = balance
        
        clerk.WriteLogRecord(record)
        clerk.ForceLog()
        ' Perform the transaction
        balance -= ammount
        AccountManager.WriteAccountBalance(filename, balance)
        
        ' Commit or abort the transaction 
        If commit Then
            ContextUtil.SetComplete()
        Else
            ContextUtil.SetAbort()
        End If
    End Sub
    
End Class

Následující příklad kódu ukazuje klienta, který provádí tento kompenzátor a pracovní proces.

#using "System.EnterpriseServices.dll"

using namespace System;

[assembly: System::Reflection::AssemblyKeyFile("CrmServer.key")];

int main ()
{

    // Create a new account object. The object is created in a COM+ server application.
    Account^ account = gcnew Account();

    // Transactionally debit the account.
    try
    {
        account->Filename = System::IO::Path::GetFullPath("JohnDoe");
        account->AllowCommit = true;
        account->DebitAccount(3);
    }
    finally
    {
        delete account;
    }

}
using System;

public class CrmClient
{

    public static void Main ()
    {

        // Create a new account object. The object is created in a COM+ server application.
        Account account = new Account();

        // Transactionally debit the account.
        try
        {
            account.Filename = System.IO.Path.GetFullPath("JohnDoe");
            account.AllowCommit = true;
            account.DebitAccount(3);
        }
        finally
        {
            account.Dispose();
        }
    }
}
Public Class CrmClient
    
    
    Public Shared Sub Main() 
        
        ' Create a new account object. The object is created in a COM+ server application.
        Dim account As New Account()
        
        ' Transactionally debit the account.
        Try
            account.Filenam = System.IO.Path.GetFullPath("JohnDoe")
            account.AllowCommit = True
            account.DebitAccount(3)
        Finally
            account.Dispose()
        End Try
    
    End Sub
End Class

Poznámky

Uživatel by měl rozšířit z tohoto objektu, aby mohl napsat vlastní transakce Kompenzační nástroj.

Kompenzační prvek musí mít vždy veřejný konstruktor; v opačném případě ho modul pro obnovení nemůže vytvořit.

Další informace najdete v tématu Postupy: Create kompenzační Resource Manager (CRM).

Konstruktory

Compensator()

Inicializuje novou instanci Compensator třídy .

Vlastnosti

Clerk

Získá hodnotu představující kompenzační Resource Manager (CRM) Clerk objektu.

Metody

AbortRecord(LogRecord)

Doručí záznam protokolu do kompenzačního Resource Manager (CRM) kompenzátoru během fáze přerušení.

Activate()

Volá se infrastrukturou, když je objekt vytvořen nebo přidělen z fondu. Přepsání této metody pro přidání vlastního inicializačního kódu do objektů.

(Zděděno od ServicedComponent)
BeginAbort(Boolean)

Oznámí kompenzačnímu Resource Manager (CRM) fázi přerušení dokončení transakce a nadcházející doručení záznamů.

BeginCommit(Boolean)

Oznámí kompenzačnímu Resource Manager (CRM) fázi potvrzení dokončení transakce a nadcházející doručení záznamů.

BeginPrepare()

Oznámí kompenzačnímu Resource Manager (CRM) fázi přípravy dokončení transakce a nadcházející doručení záznamů.

CanBePooled()

Tuto metodu volá infrastruktura před vložením objektu zpět do fondu. Přepsat tuto metodu hlasování o tom, zda je objekt vložen zpět do fondu.

(Zděděno od ServicedComponent)
CommitRecord(LogRecord)

Doručí záznam protokolu v pořadí dopředné během fáze potvrzení.

Construct(String)

Volá se infrastrukturou hned po zavolání konstruktoru a předá řetězec konstruktoru. Přepsat tuto metodu použít hodnotu stavebního řetězce.

(Zděděno od ServicedComponent)
CreateObjRef(Type)

Vytvoří objekt, který obsahuje všechny relevantní informace potřebné k vygenerování proxy sloužící ke komunikaci se vzdáleným objektem.

(Zděděno od MarshalByRefObject)
Deactivate()

Volána infrastrukturou, když se objekt chystá deaktivovat. Přepsáním této metody přidáte vlastní finalizační kód do objektů při použití zkompilovaného kódu za běhu (JIT) nebo sdružování objektů.

(Zděděno od ServicedComponent)
Dispose()

Uvolní všechny prostředky používané nástrojem ServicedComponent.

(Zděděno od ServicedComponent)
Dispose(Boolean)

Uvolní nespravované prostředky používané nástrojem ServicedComponent a volitelně uvolní spravované prostředky.

(Zděděno od ServicedComponent)
EndAbort()

Oznámí kompenzačnímu Resource Manager (CRM), že obdržel všechny záznamy protokolu dostupné během fáze přerušení.

EndCommit()

Oznámí kompenzačnímu Resource Manager (CRM), že doručil všechny záznamy protokolu dostupné během fáze potvrzení.

EndPrepare()

Oznámí kompenzačnímu Resource Manager (CRM), že měl během fáze přípravy k dispozici všechny záznamy protokolu.

Equals(Object)

Určí, zda se zadaný objekt rovná aktuálnímu objektu.

(Zděděno od Object)
GetHashCode()

Slouží jako výchozí hashovací funkce.

(Zděděno od Object)
GetLifetimeService()
Zastaralé.

Načte aktuální životnost objektu služby, který řídí zásady životnosti pro tuto instanci.

(Zděděno od MarshalByRefObject)
GetType()

Type Získá z aktuální instance.

(Zděděno od Object)
InitializeLifetimeService()
Zastaralé.

Získá životnost objektu služby, který řídí zásady životnosti pro tuto instanci.

(Zděděno od MarshalByRefObject)
MemberwiseClone()

Vytvoří mělkou kopii aktuálního Objectsouboru .

(Zděděno od Object)
MemberwiseClone(Boolean)

Vytvoří mělkou kopii aktuálního MarshalByRefObject objektu.

(Zděděno od MarshalByRefObject)
PrepareRecord(LogRecord)

Doručí záznam protokolu v dopředném pořadí během fáze přípravy.

ToString()

Vrátí řetězec, který představuje aktuální objekt.

(Zděděno od Object)

Explicitní implementace rozhraní

IRemoteDispatch.RemoteDispatchAutoDone(String)

Toto rozhraní API podporuje produktovou infrastrukturu a není určené k použití přímo z uživatelského kódu.

Zajišťuje, že v kontextu modelu COM + bit objektu ServicedComponentdone třídy je nastaven na po true vyvolání vzdálené metody.

(Zděděno od ServicedComponent)
IRemoteDispatch.RemoteDispatchNotAutoDone(String)

Nezajistí, že v kontextu modelu COM+ je bit objektu ServicedComponentdone třídy nastaven na hodnotu true po vzdáleném vyvolání metody.

(Zděděno od ServicedComponent)
IServicedComponentInfo.GetComponentInfo(Int32, String[])

Získá určité informace o ServicedComponent instanci třídy.

(Zděděno od ServicedComponent)

Platí pro