Compensator Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Representa a classe base de todos os compensadores do 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
- Herança
Exemplos
O exemplo de código a seguir demonstra o uso dessa 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
Esse compensador é usado pela classe de trabalho a seguir.
// 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
O exemplo de código a seguir demonstra um cliente que exerce esse compensador e trabalho.
#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
Comentários
O usuário deve estender desse objeto para gravar um compensador de transação personalizado.
Um compensador sempre deve ter um construtor público; caso contrário, o mecanismo de recuperação não poderá criá-lo.
Para obter mais informações, consulte Como Create um CRM (Compensating Resource Manager)..
Construtores
Compensator() |
Inicializa uma nova instância da classe Compensator. |
Propriedades
Clerk |
Obtém um valor que representa o objeto Clerk do CRM (Compensating Resource Manager). |
Métodos
AbortRecord(LogRecord) |
Fornece um registro de log ao CRM (Compensating Resource Manager) durante a fase de anulação. |
Activate() |
Chamado pela infraestrutura quando o objeto é criado ou alocado de um pool. Substitua este método para adicionar código de inicialização personalizada aos objetos. (Herdado de ServicedComponent) |
BeginAbort(Boolean) |
Notifica o CRM (Compensating Resource Manager) sobre a fase de anulação da conclusão da transação e a próxima entrega de registros. |
BeginCommit(Boolean) |
Notifica o CRM (Compensating Resource Manager) sobre a fase de confirmação da conclusão da transação e a próxima entrega de registros. |
BeginPrepare() |
Notifica o CRM (Compensating Resource Manager) sobre a fase de preparação da conclusão da transação e a próxima entrega de registros. |
CanBePooled() |
Este método é chamado pela infraestrutura antes que o objeto seja colocado de volta no pool. Substitua este método para votar se o objeto deve ser colocado de volta no pool. (Herdado de ServicedComponent) |
CommitRecord(LogRecord) |
Fornece um registro de log em ordem de encaminhamento durante a fase de confirmação. |
Construct(String) |
Chamado pela infraestrutura logo após o construtor ser chamado, passando a cadeia de caracteres do construtor. Substitua este método para fazer uso do valor da cadeia de caracteres de construção. (Herdado de ServicedComponent) |
CreateObjRef(Type) |
Cria um objeto que contém todas as informações relevantes necessárias para gerar um proxy usado para se comunicar com um objeto remoto. (Herdado de MarshalByRefObject) |
Deactivate() |
Chamado pela infraestrutura quando o objeto está prestes a ser desativado. Substitua este método para adicionar código de finalização personalizado a objetos quando o código compilado JIT (Just-In-Time) ou o pool de objetos for usado. (Herdado de ServicedComponent) |
Dispose() |
Libera todos os recursos usados pelo ServicedComponent. (Herdado de ServicedComponent) |
Dispose(Boolean) |
Libera os recursos não gerenciados usados pelo ServicedComponent e opcionalmente libera os recursos gerenciados. (Herdado de ServicedComponent) |
EndAbort() |
Notifica o compensador do CRM (Compensating Resource Manager) que ele recebeu todos os registros de log disponíveis durante a fase de anulação. |
EndCommit() |
Notifica o compensador do CRM (Compensating Resource Manager) que ele recebeu todos os registros de log disponíveis durante a fase de confirmação. |
EndPrepare() |
Notifica o compensador do CRM (Compensating Resource Manager) que ele recebeu todos os registros de log disponíveis durante a fase de preparação. |
Equals(Object) |
Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object) |
GetHashCode() |
Serve como a função de hash padrão. (Herdado de Object) |
GetLifetimeService() |
Obsoleto.
Recupera o objeto de serviço de tempo de vida atual que controla a política de ciclo de vida para esta instância. (Herdado de MarshalByRefObject) |
GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
InitializeLifetimeService() |
Obsoleto.
Obtém um objeto de serviço de tempo de vida para controlar a política de tempo de vida para essa instância. (Herdado de MarshalByRefObject) |
MemberwiseClone() |
Cria uma cópia superficial do Object atual. (Herdado de Object) |
MemberwiseClone(Boolean) |
Cria uma cópia superficial do objeto MarshalByRefObject atual. (Herdado de MarshalByRefObject) |
PrepareRecord(LogRecord) |
Fornece um registro de log em ordem subsequente durante a fase de preparação. |
ToString() |
Retorna uma cadeia de caracteres que representa o objeto atual. (Herdado de Object) |
Implantações explícitas de interface
IRemoteDispatch.RemoteDispatchAutoDone(String) |
Esta API dá suporte à infraestrutura do produto e não deve ser usada diretamente do seu código. Garante que, no contexto COM+, o bit |
IRemoteDispatch.RemoteDispatchNotAutoDone(String) |
Não garante que, no contexto COM+, o bit |
IServicedComponentInfo.GetComponentInfo(Int32, String[]) |
Obtém determinadas informações sobre a instância da classe ServicedComponent. (Herdado de ServicedComponent) |