Compensator-Klasse
Stellt die Basisklasse für alle CRM-Kompensatoren (Compensating Resource Manager) dar.
Namespace: System.EnterpriseServices.CompensatingResourceManager
Assembly: System.EnterpriseServices (in system.enterpriseservices.dll)
Syntax
'Declaration
Public Class Compensator
Inherits ServicedComponent
'Usage
Dim instance As Compensator
public class Compensator : ServicedComponent
public ref class Compensator : public ServicedComponent
public class Compensator extends ServicedComponent
public class Compensator extends ServicedComponent
Hinweise
Der Benutzer sollte dieses Objekt erweitern, um einen benutzerdefinierten Transaktionskompensator zu schreiben.
Ein Kompensator muss stets über einen öffentlichen Konstruktor verfügen, da er andernfalls nicht vom Wiederherstellungsmodul erstellt werden kann.
Weitere Informationen finden Sie unter Gewusst wie: Erstellen eines kompensierenden Ressourcen-Managers.
Beispiel
Im folgenden Codebeispiel wird die Verwendung dieser Klasse veranschaulicht.
' A CRM Compensator
Public Class AccountCompensator
Inherits Compensator
Private receivedPrepareRecord As Boolean = False
Public Overrides Sub BeginPrepare()
End Sub 'BeginPrepare
' 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 'BeginCommit
' 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 'EndCommit
' nothing to do
Public Overrides Sub BeginAbort(ByVal abort As Boolean)
End Sub 'BeginAbort
' 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 'EndAbort
End Class 'AccountCompensator ' 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 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 extends Compensator
{
private boolean receivedPrepareRecord = false;
public void BeginPrepare()
{
// nothing to do
} //BeginPrepare
public boolean PrepareRecord(LogRecord log)
{
// Check the validity of the record.
if (log == null) {
return true;
}
Object record[] = new Object[] { log.get_Record() };
if (record == null) {
return true;
}
if (record.get_Length() != 2) {
return true;
}
// The record is valid.
receivedPrepareRecord = true;
return false;
} //PrepareRecord
public boolean EndPrepare()
{
// Allow the transaction to proceed onlyif we have received
// a prepare record.
if (receivedPrepareRecord) {
return true;
}
else {
return false;
}
} //EndPrepare
public void BeginCommit(boolean commit)
{
// nothing to do
} //BeginCommit
public boolean CommitRecord(LogRecord log)
{
// nothing to do
return false;
} //CommitRecord
public void EndCommit()
{
// nothing to do
} //EndCommit
public void BeginAbort(boolean abort)
{
// nothing to do
} //BeginAbort
public boolean AbortRecord(LogRecord log)
{
// Check the validity of the record.
if (log == null) {
return true;
}
Object record[] = new Object[] { log.get_Record() };
if (record == null) {
return true;
}
if (record.get_Length() != 2) {
return true;
}
// Extract old account data from the record.
String fileName = (String)(record.get_Item(0));
int balance = System.Convert.ToInt32(record[1]);
// Restore the old state of the account.
AccountManager.WriteAccountBalance(fileName, balance);
return false;
} //AbortRecord
public void EndAbort()
{
// nothing to do
} //EndAbort
} //AccountCompensator
Dieser Kompensator wird von der folgenden Workerklasse verwendet.
' 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 Class 'Account
// 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 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
/** @attribute Transaction()
*/
public class Account extends ServicedComponent
{
// A data member for the account file name.
/** @property
*/
private String fileName;
public String get_fileName()
{
return fileName;
} //get_fileName
public void set_fileName(String value)
{
fileName = value;
} //set_fileName
// A boolean data member that determines whether to commit or
// abort the transaction.
private boolean commit;
/** @property
*/
public boolean get_AllowCommit()
{
return commit;
} //get_AllowCommit
/** @property
*/
public void set_AllowCommit(boolean value)
{
commit = value;
} //set_AllowCommit
// Debit the account,
public void DebitAccount(int ammount)
{
// Create a new clerk using the AccountCompensator class.
Clerk clerk = new Clerk(AccountCompensator.class.ToType(),
"An account transaction compensator",
CompensatorOptions.AllPhases);
// Create a record of previous account status, and deliver
// it to the clerk.
Console.WriteLine("filename = " + fileName);
int balance = AccountManager.ReadAccountBalance(fileName);
Object record[] = new Object[2];
record.set_Item(0, fileName);
record.set_Item(1,(Int32)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();
}
} //DebitAccount
} //Account
Im folgenden Codebeispiel wird ein Client veranschaulicht, der diesen Kompensator und Worker verwendet.
Imports System
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 'Main
End Class 'CrmClient
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();
}
}
}
#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;
}
}
import System.*;
public class CrmClient
{
public static void main(String[] args)
{
// Create a new account object. The object is created in a COM+
// server application.
Account account = new Account();
// Transactionally debit the account.
try {
account.set_fileName(System.IO.Path.GetFullPath("JohnDoe"));
account.set_AllowCommit(true);
account.DebitAccount(3);
}
finally {
account.Dispose();
}
} //main
} //CrmClient
Vererbungshierarchie
System.Object
System.MarshalByRefObject
System.ContextBoundObject
System.EnterpriseServices.ServicedComponent
System.EnterpriseServices.CompensatingResourceManager.Compensator
Threadsicherheit
Alle öffentlichen statischen (Shared in Visual Basic) Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.
Plattformen
Windows 98, Windows 2000 SP4, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.
Versionsinformationen
.NET Framework
Unterstützt in: 2.0, 1.1, 1.0
Siehe auch
Referenz
Compensator-Member
System.EnterpriseServices.CompensatingResourceManager-Namespace