Compensator Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Rappresenta la classe base di tutti i compensatori CRM (Compensating Resource Manager).
public ref class Compensator : System::EnterpriseServices::ServicedComponent
public class Compensator : System.EnterpriseServices.ServicedComponent
type Compensator = class
inherit ServicedComponent
Public Class Compensator
Inherits ServicedComponent
- Ereditarietà
Esempio
Nell'esempio di codice seguente viene illustrato l'uso di questa classe.
// 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
Questo compensazione viene usato dalla classe di lavoro seguente.
// 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
Nell'esempio di codice seguente viene illustrato un client che esegue questo compensazione e un ruolo di lavoro.
#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
Commenti
L'utente deve estendersi da questo oggetto per scrivere un compensatore di transazione personalizzato.
Un compensatore deve sempre avere un costruttore pubblico; in caso contrario, il motore di ripristino non può crearlo.
Per altre informazioni, vedere Procedura: Create un Resource Manager di compensazione (CRM).
Costruttori
Compensator() |
Inizializza una nuova istanza della classe Compensator. |
Proprietà
Clerk |
Recupera un valore che rappresenta l'oggetto CRM (Compensating Resource Manager) Clerk. |
Metodi
AbortRecord(LogRecord) |
Recapita un record del log per la classe Compensator CRM (Compensating Resource Manager) durante la fase di interruzione. |
Activate() |
Metodo chiamato dall’infrastruttura quando l’oggetto viene creato o allocato da un pool. Sottoporre a override il metodo per aggiungere codice di inizializzazione personalizzato agli oggetti. (Ereditato da ServicedComponent) |
BeginAbort(Boolean) |
Notifica alla classe Compensator CRM (Compensating Resource Manager) la fase di interruzione del completamento della transazione e l'imminente recapito dei record. |
BeginCommit(Boolean) |
Notifica alla classe Compensator CRM (Compensating Resource Manager) la fase di commit del completamento della transazione e l'imminente recapito dei record. |
BeginPrepare() |
Notifica alla classe Compensator CRM (Compensating Resource Manager) la fase di preparazione del completamento della transazione e l'imminente recapito dei record. |
CanBePooled() |
Questo metodo viene chiamato dall’infrastruttura prima che l’oggetto sia inserito nuovamente nel pool. Sottoporre a override il metodo per determinare il reinserimento dell'oggetto nel pool. (Ereditato da ServicedComponent) |
CommitRecord(LogRecord) |
Recapita un record del log in ordine di inoltro durante la fase di commit. |
Construct(String) |
Metodo chiamato dall'infrastruttura subito dopo la chiamata al costruttore, passando la stringa del costruttore. Sottoporre a override il metodo per utilizzare il valore della stringa del costruttore. (Ereditato da ServicedComponent) |
CreateObjRef(Type) |
Consente di creare un oggetto che contiene tutte le informazioni rilevanti necessarie per la generazione del proxy utilizzato per effettuare la comunicazione con un oggetto remoto. (Ereditato da MarshalByRefObject) |
Deactivate() |
Metodo chiamato dall’infrastruttura quando l’oggetto sta per essere disattivato. Sottoporre a override il metodo per aggiungere codice di completamento personalizzato agli oggetti quando si utilizza codice compilato JIT o il pool di oggetti. (Ereditato da ServicedComponent) |
Dispose() |
Rilascia tutte le risorse usate da ServicedComponent. (Ereditato da ServicedComponent) |
Dispose(Boolean) |
Rilascia le risorse non gestite usate da ServicedComponent e, facoltativamente, le risorse gestite. (Ereditato da ServicedComponent) |
EndAbort() |
Notifica alla classe Compensator CRM (Compensating Resource Manager) che ha ricevuto tutti i record disponibili durante la fase di interruzione. |
EndCommit() |
Notifica alla classe Compensator CRM (Compensating Resource Manager) che ha recapitato tutti i record disponibili durante la fase di commit. |
EndPrepare() |
Notifica alla classe Compensator CRM (Compensating Resource Manager) che ha ricevuto tutti i record disponibili durante la fase di preparazione. |
Equals(Object) |
Determina se l'oggetto specificato è uguale all'oggetto corrente. (Ereditato da Object) |
GetHashCode() |
Funge da funzione hash predefinita. (Ereditato da Object) |
GetLifetimeService() |
Obsoleti.
Consente di recuperare l'oggetto servizio di durata corrente per controllare i criteri di durata per l'istanza. (Ereditato da MarshalByRefObject) |
GetType() |
Ottiene l'oggetto Type dell'istanza corrente. (Ereditato da Object) |
InitializeLifetimeService() |
Obsoleti.
Ottiene un oggetto servizio di durata per controllare i criteri di durata per questa istanza. (Ereditato da MarshalByRefObject) |
MemberwiseClone() |
Crea una copia superficiale dell'oggetto Object corrente. (Ereditato da Object) |
MemberwiseClone(Boolean) |
Crea una copia dei riferimenti dell'oggetto MarshalByRefObject corrente. (Ereditato da MarshalByRefObject) |
PrepareRecord(LogRecord) |
Recapita un record del log in ordine di inoltro durante la fase di preparazione. |
ToString() |
Restituisce una stringa che rappresenta l'oggetto corrente. (Ereditato da Object) |
Implementazioni dell'interfaccia esplicita
IRemoteDispatch.RemoteDispatchAutoDone(String) |
Questa API supporta l'infrastruttura del prodotto e non è previsto che venga usata direttamente dal codice. Garantisce che, nel contesto COM+, il bit |
IRemoteDispatch.RemoteDispatchNotAutoDone(String) |
Non garantisce che, nel contesto COM+, il bit |
IServicedComponentInfo.GetComponentInfo(Int32, String[]) |
Ottiene alcune informazioni sull'istanza della classe ServicedComponent. (Ereditato da ServicedComponent) |