Compensator クラス
アセンブリ: System.EnterpriseServices (system.enterpriseservices.dll 内)


カスタム トランザクション Compensator を書き込むユーザーは、このオブジェクトを拡張します。
Compensator には、常にパブリック コンストラクタが存在している必要があります。それ以外の場合、リカバリ エンジンではこれを作成できません。

' 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
この Compensator は、次のワーカー クラスで使用されます。
' 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
この Compensator とワーカーを実行するクライアントを次のコード例に示します。
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

System.MarshalByRefObject
System.ContextBoundObject
System.EnterpriseServices.ServicedComponent
System.EnterpriseServices.CompensatingResourceManager.Compensator


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 によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


- Compensator クラスのページへのリンク