Postupy: Vývoj zprostředkovatele řízení instancí
Následující postup obsahuje kroky k vytvoření vlastního zprostředkovatele řízení instancí.
Vytvořte projekt knihovny tříd.
Přidejte odkaz na knihovnu Microsoft.ApplicationServer.StoreManagement.dll. Dále přidejte odkaz na sestavení System.Configuration za účelem kompilace ukázky kódu v tomto tématu.
Na začátek zdrojového souboru přidejte následující příkaz.
using Microsoft.ApplicationServer.StoreManagement.Control; using Microsoft.ApplicationServer.StoreManagement.Control; using System.Data.SqlClient; using System.Collections.Specialized; using System.Threading; using System.Data;
Odvozením od třídy InstanceControlProvider vytvořte třídu pro zprostředkovatele řízení instancí.
public class MySqlInstanceControlProvider : InstanceControlProvider { }
Implementujte metodu Initialize. Tato metoda přijímá balík vlastností, který odpovídá konfiguračním informacím zadaným v konfiguračním souboru. Data v tomto balíku vlastností se použijí k sestavení zprostředkovatele. Před voláním metody CreateInstanceControl nebo UniqueProviderIdentifier je volána metoda Initialize.
Poznámka
Pro vzdálené scénáře by kolekce název-hodnota obsahovala položku nazvanou EnableServiceModelMetadata. Zprostředkovatel se může před vyvoláním metody base.Initialize rozhodnout ignorovat a odebrat tento parametr. Tato vlastnost obvykle slouží k určení, zda vyvolat metodu SetMetadata(“ServiceModel”, true) u objektu Microsoft.Web.Administration.ServerManager.
string ConnectionString { get; set; } public override void Initialize(string name, NameValueCollection config) { this.ConnectionString = config["connectionString"]; // Initialize the base class base.Initialize(name, config); }
Implementujte metodu CreateInstanceControl třídy InstanceControlProvider, aby byl vrácen vlastní objekt InstanceControl, který klient použije k přístupu k objektu CommandSend nebo CommandReceive.
public override InstanceControl CreateInstanceControl() { SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder(this.ConnectionString); connectionStringBuilder.AsynchronousProcessing = true; return new MySqlInstanceControl(connectionStringBuilder.ConnectionString); }
Poznámka
Informace o implementaci typu MySqlInstanceControl naleznete v další části.
Implementujte metodu UniqueProviderIdentifier. Na základě jedinečného ID zprostředkovatele vráceného touto metodou lze určit, zda různé objekty zprostředkovatelů po svém překladu odkazují na stejné základní úložiště.
string UniqueStoreIdentifier { get; set; } public override string UniqueProviderIdentifier() { this.UniqueStoreIdentifier = GetUniqueStoreIdentifier(this.ConnectionString); return this.UniqueStoreIdentifier; } private string GetUniqueStoreIdentifier(string connectionString) { using (SqlConnection connection = new SqlConnection(connectionString)) { using (SqlCommand command = new SqlCommand()) { command.CommandType = System.Data.CommandType.Text; command.CommandText = "SELECT TOP (1) [StoreIdentifier] FROM [Microsoft.ApplicationServer.DurableInstancing].[StoreVersion]"; command.Connection = connection; command.Connection.Open(); Guid identifier = (Guid)command.ExecuteScalar(); return identifier.ToString(); } } }
Implementace metody InstanceControl
Následující postup obsahuje kroky k vytvoření vlastního typu InstanceControl.
Odvozením ze třídy InstanceControl vytvořte třídu.
public class MySqlInstanceControl : InstanceControl { readonly string connectionString; public MySqlInstanceControl(string connectionString) { this.connectionString = connectionString; } }
Implementujte vlastnost CommandReceive. Metoda přístupu Get vlastnosti CommandReceive by měla vrátit objekt CommandReceive. Klient u tohoto objektu vyvolá metody pro asynchronní přijetí příkazů z fronty příkazů.
MySqlCommandReceive commandReceive; public override CommandReceive CommandReceive { get { if (this.commandReceive == null) { MySqlCommandReceive tmp = new MySqlCommandReceive(this.connectionString); Interlocked.CompareExchange(ref this.commandReceive, tmp, null); } return this.commandReceive; } }
Implementujte vlastnost CommandSend a vraťte vlastní objekt CommandSend z metody přístupu Get. Metoda přístupu Get vlastnosti CommandSend by měla vrátit objekt CommandSend. Klient u tohoto objektu vyvolá metody pro asynchronní odeslání příkazů do fronty příkazů.
MySqlCommandSend commandSend; public override CommandSend CommandSend { get { if (this.commandSend == null) { MySqlCommandSend tmp = new MySqlCommandSend(this.connectionString); Interlocked.CompareExchange(ref this.commandSend, tmp, null); return this.commandSend; } return this.CommandSend; } }
Klient používá tyto dva objekty k posílání odkazů do fronty příkazů (zařazování příkazů) a přijímání příkazů z fronty (vyřazení příkazu z fronty). Například rutina řízení instancí zařadí příkaz do fronty pomocí objektu CommandSend a služba Správa pracovního postupu (WMS) příkaz z fronty vyřadí pomocí objektu CommandReceive. Za jistých okolností, například když je spuštěna rutina Remove-ASAppServiceInstance, zpracuje úložiště příkaz samo, aby došlo k odebrání příslušné instance z úložiště instancí.
Poznámka
Informace o implementacích typů MySqlCommandSend a MySqlCommandReceive naleznete v následujících částech.
Implementace typu CommandSend
Vytvoření vlastního typu CommandSend:
Vytvořte třídu odvozením od třídy CommandSend a implementujte metody BeginTrySend a EndTrySend.
public class MySqlCommandSend : CommandSend { readonly string connectionString; public MySqlCommandSend(string connectionString) { this.connectionString = connectionString; } public override IAsyncResult BeginSend(InstanceCommand command, TimeSpan timeout, AsyncCallback callback, object state) { throw new NotImplementedException(); } public override void EndSend(IAsyncResult result) { throw new NotImplementedException(); } }
Implementace typu CommandReceive
Vytvoření vlastního typu CommandReceive:
Vytvořte třídu odvozením od třídy CommandReceive a implementujte metody BeginTryReceive a EndTryReceive.
public class MySqlCommandReceive : CommandReceive { readonly string connectionString; Queue<MySqlReceivedInstanceCommand> receivedInstanceCommands; public MySqlCommandReceive(string connectionString) { this.connectionString = connectionString; this.receivedInstanceCommands = new Queue<MySqlReceivedInstanceCommand>(); } public override IAsyncResult BeginTryReceive(TimeSpan timeout, AsyncCallback callback, object state) { throw new NotImplementedException(); } public override bool EndTryReceive(IAsyncResult result, out ReceivedInstanceCommand command) { throw new NotImplementedException(); } }
Poznámka
Informace o implementaci třídy MySqlReceivedInstanceCommand naleznete v další části.
Implementace třídy ReceivedInstanceCommand
Vytvoření vlastního typu ReceivedInstanceCommand:
Vytvořte třídu odvozením od třídy ReceivedInstanceCommand a implementujte vlastnost InstanceCommandContext.
class MySqlReceivedInstanceCommand : ReceivedInstanceCommand { long commandId; MySqlCommandReceive receiver; MySqlInstanceCommandContext context; internal MySqlReceivedInstanceCommand(long commandId, Guid instanceId, Microsoft.ApplicationServer.StoreManagement.Control.CommandType commandType, IDictionary<string, string> serviceIdentifier, TimeSpan timeout, MySqlCommandReceive receiver) : base() { this.commandId = commandId; base.CommandType = commandType; base.InstanceId = instanceId; base.ServiceIdentifier = serviceIdentifier; //this.CommandTimeout = new TimeoutHelper(timeout, true); this.receiver = receiver; this.context = new MySqlInstanceCommandContext(this); } public override InstanceCommandContext InstanceCommandContext { get { return this.context; } } }
Poznámka
Informace o implementaci typu MySqlInstanceCommandContext naleznete v další části.
Implementace typu InstanceCommandContext
Vytvoření vlastního typu InstanceCommandContext:
Vytvořte třídu odvozením od třídy InstanceCommandContext a implementujte metody BeginComplete, EndComplete, BeginAbandon a EndAbandon.
Klient vyvolá metodu BeginComplete u objektu InstanceCommandContext, aby bylo oznámeno, že se zdařilo spuštění příkazu. Potom by měl zprostředkovatel řízení odebrat příkaz z fronty příkazů. Správa pracovního postupu vyvolá tuto metodu tehdy, pokud je spuštění příkazu úspěšné.
Klient vyvolá metodu BeginAbandon u objektu InstanceCommandContext, aby bylo oznámeno, že se nezdařilo spuštění příkazu. Je na zprostředkovateli řízení instancí, aby rozhodl, co s příkazem udělá. Zprostředkovatel řízení může například zkusit příkaz spustit znovu s určitým počtem opakování, než příkaz z fronty příkazů odebere. Správa pracovního postupu vyvolá tuto metodu tehdy, pokud není spuštění příkazu úspěšné.
class MySqlInstanceCommandContext : InstanceCommandContext { MySqlReceivedInstanceCommand command; internal MySqlInstanceCommandContext(MySqlReceivedInstanceCommand command) { this.command = command; } public override IAsyncResult BeginAbandon(Exception exception, TimeSpan timeout, AsyncCallback callback, object state) { throw new NotImplementedException(); } public override IAsyncResult BeginComplete(TimeSpan timeout, AsyncCallback callback, object state) { throw new NotImplementedException(); } public override void EndAbandon(IAsyncResult result) { throw new NotImplementedException(); } public override void EndComplete(IAsyncResult result) { throw new NotImplementedException(); } }
Další odkazy
Koncepty
Postupy: Vývoj zprostředkovatele úložiště instancí
Postupy: Vývoj zprostředkovatele dotazů na instance
Postupy: Konfigurace zprostředkovatelů úložišť instancí, dotazů a řízení
Zprostředkovatelé úložiště instancí, dotazů a řízení
2011-12-05