Auf der Suche nach einer Möglichkeit regelmäßige SQL Azure Backups als "Hintergrundprozess" durchführen zu lassen, bin ich über einen netten Blog Post von Steve Marx gestolpert:
Skipping Windows Azure Startup Tasks When Running in the Emulator
Dieser beschreibt, wie man die Ausführung von Startup Tasks, während des Betriebs im Compute Emulator, unterbindet.
Anpassen der Service Definition
Das, mit dem Windows Azure SDK 1.5 hinzugekommene, Feature "xPath Values in Windows Azure" erlaubt es, Umgebungsvariablen mit Werten aus der Azure Laufzeitumgebung zu befüllen.
Somit kann man zum Beispiel eine Umgebungsvariablen TestIsEmulated erzeugen, die den Wert aus der RoleEnvironment.IsEmulated Eigenschaft enthält.
Auszug aus der ServiceDefinition.csdef:
<ServiceDefinition name="StartupTasksUnterbinden" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> <WorkerRole name="DummyRole" vmsize="ExtraSmall"> <Startup> <Task commandLine="Startup.cmd" executionContext="elevated" taskType="background"> <Environment> <Variable name="TestIsEmulated"> <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated"/> </Variable> </Environment> </Task> </Startup> <Imports> <Import moduleName="Diagnostics" /> </Imports> </WorkerRole> </ServiceDefinition>
Anpassen der Startup Skripte
Anschließend lässt sich dieser Wert im Startup Skript abfragen, um so die Ausführung zu unterbinden.
Hierzu fügt man zu Beginn des Skriptes folgende Zeile hinzu:
if "%TestIsEmulated%"=="true" goto :EOF
Beispielanwendung
Hierzu ein kleines Beispiel:
Ich habe ein Cloud Projekt mit einer Worker Rolle erstellt.
Diese Worker Rolle enthält folgendes Skript (Startup.cmd):
@echo off del Ergebnis.txt if "%TestIsEmulated%"=="true" goto :EOF echo Startup Task wurde ausgefuehrt. > Ergebnis.txt
Wenn also das Startup Task ausgeführt wird, wird eine Text Datei mit dem Inhalt "Startup Task wurde ausgefuehrt." erstellt.
In der Run Methode des Worker Role Entry Points prüfe ich nun, ob diese Datei exisiert und gebe die entsprechene Trace Meldung aus:
Auszug aus dem Worker Role Entry Point:
public class WorkerRole : RoleEntryPoint { public override void Run() { while (true) { Thread.Sleep(10000); if (File.Exists(@"Ergebnis.txt")) Trace.WriteLine(File.ReadAllText(@"Ergebnis.txt")); else Trace.WriteLine("Startup Task wurde NICHT ausgeführt."); } } // ... }
Bei Ausführung im Compute Emulator sieht das Ergebnis wie folgt aus:
Download der Beispielanwendung:
Weitere Informationen unter: |