Application Recovery and Restart (ARR) – zadnja linija odbrane


Ovaj naslov predstavlja III dio u seriji postova oko .NET i Windows 7. Prvi i drugi dio govore o windows taskbaru odnosno podršci za senzore.

Kao software developer nerijetko ste suočeni sa situacijom kada se aplikacija sruši ili zaglavi iz nepoznatog razloga,i ne možete je nikakvim konvencijonalnim metodama ubjediti da sačuva podatke ili da se zatvori. U situacijama kada se iz nepoznatog razloga ovo desi, najviše stradaju podatci koje obrađuje aplikacija i oni se nepovratno izgube.

Šta uraditi i takvim situacijama? Imamo dvije opcije:

1. Moliti se da do toga ne dođe.

2. Koristiti novo proširenje Windows 7 ARR, (koje u stvari se pojavilo izlaskom Viste).

ARR proširenje uključeno je u API Code Pack, i na vrlo jednostavan način ga možemo koristiti na našim aplikacijama. Procedura korištenja ARR je sljedeća:

1. Registracija na ARR

2. Implementacija Recovery metode

3. Skidanje sa ARR

Ova tri koraka dovoljna su za potpunu implementaciju ARR sistema.

Registrirati se na ARR, jednostavna je operacija i potrebno ju je postaviti na samom početku životnog vijeka aplikacije, odnosno tamo gdje prije toga se ne bi terebala desiti nikakva ne očekivana situacija da nam aplikacija padne. To su uglavnom metode inicijalizacije mainwindow objekta. Registracija se vrši posebno na Recovery a posebno na Restart.

private static void RegisterApplicationRecoveryAndRestart()
{
    if (!CoreHelpers.RunningOnVista && !CoreHelpers.RunningOnWin7)
        return;

    // register for Application Restart
    RestartSettings restartSettings =
        new RestartSettings(string.Empty, RestartRestrictions.None);
    ApplicationRestartRecoveryManager.RegisterForApplicationRestart(restartSettings);

    // register for Application Recovery
    RecoverySettings recoverySettings =
        new RecoverySettings(new RecoveryData(PerformRecovery, null), 0);
    ApplicationRestartRecoveryManager.RegisterForApplicationRecovery(recoverySettings);
}

Gornja metoda predstavlja registraciju na Restart, odnosno tražimo od ARR da naša aplikacija izvrši restartovanje u svim slučajevima neželjenog pada, osim u slučajevima kada se vrši reboot sistema ili kada se instalira određeni patch (zakrpa). Situacije u kojima želimo specificirati kad izvršiti restart definišemo enumeracijom RestartRestrictions, koja ima sljedeće vrijednosti:

Restrikcija Značenje
None bez restrikcija
NotOnCrash ne restartuj proces u koliko se radi o neobrađenom izuzetku.
NotOnHang ne restartuj proces u koliko se radi o nereagovanju aplikacija (no responding).
NotOnPatch ne restartuj proces u koliko se radi o instalaciji updejta.
NotOnReboot ne restartuj proces u koliko se radi o restartovanju OS-a uslijed instalacije updejta

Registracija na Recovery definiše metodu za procesuiranje u neočekivanim situacijama (PerformRecovery) te vremenski interval. U biti ako aplikacija treba restart potrebno je definisati metodu koja će poslije restarta aplikaciji izvršiti postavke u priješnje stanje.

Recovery metoda

private static int PerformRecovery(object parameter)
{
    try
    {
        ApplicationRestartRecoveryManager.ApplicationRecoveryInProgress();
        // Save your work here for recovery
        Console.WriteLine("Spasavanje podataka");
        ApplicationRestartRecoveryManager.ApplicationRecoveryFinished(true);
    }
    catch
    {
        ApplicationRestartRecoveryManager.ApplicationRecoveryFinished(false);
    }

    return 0;
}

Metodu za recovery porebno je pozivati konstantno u određenom periodu da bi ARR sistem bio svjestan da treba upravljati aplikacijom. Ovo se dešava kada se poziva: ApplicationRecoveryInProgress(); dok je na kraju potrebno zuavršiti recovery proces. U koliko bi se desila nekakva neočekivana situacija potrebno je uvijek je dobro postaviti ove raqdnje u try catch blok, te u catch završavati proces za fals argumentom koji ARR sistemu daje do znanja da recovery proces nije završio uspješno.

Deregistracija ili isključivanje sa ARR sistema je potrebno kada se aplikacija zatvara da bi se oslobodili resursi. Ovo postižemo sljedećim kodom:

ApplicationRestartRecoveryManager.UnregisterApplicationRestart();
ApplicationRestartRecoveryManager.UnregisterApplicationRecovery();

U narednom dijelu prikazat ćemo demo sa prezentiranim svojstvima ARR sistema.

1. Otvorite VS2010 formirajte novi WindowsForms projekat.
2. Referencirate API Code pack (vidi prethodne blog postove)
3. Postavite jedno dugme na formu i definišite Click događaj.

Klik događaj implementiramo sljedećim kodom:

/// Rusenje aplikacije
///<span style="color: #222222; font-family: 'Courier 10 Pitch', Courier, monospace; line-height: 21px;"> </span>private void button1_Click(object sender, EventArgs e)
{
    Environment.FailFast("ARR Demo intentional crash.");
}

Sada je potrebno implemetirati ARR sistem. Kao što je prezentirano u prvom dijelu posta.

1. U Form1 konstruktoru registrujte ARR

2. U Closed događaju isključite se sa ARR događaja.

Implementacija recovery metode je prikazana na gornjim listingom.

Kada aplikacja padne, ARR sistem pokušava da izvrši recovery, pozivajući metodu PerformRecovery. Ova metoda pokušava da spasi sve relevantne podatke.

Kada smo sve implementirali Buildajte aplikaciju, te je locirate na disku. Pokrenite aplikaciju sa diska i kliknite na dugme za rušenje. Poslije izvjesnog vremena pojavljuje se poruke koju smo implementirali u recovery metodi da su naši podaci spašeni. U koliko sacekamo minutu i kliknemo na dugme nasa aplikacija ce se restartovati.

Recovery aplikacije

Restart aplikacije

 

Source code za ovaj primjer možete skinuti sa ovog linka.

About Bahrudin Hrnjica

PhD in Mechanical Engineering, Microsoft MVP for .NET. Likes .NET, Math, Mechanical Engineering, Evolutionary Algorithms, Blogging.

Posted on 02/05/2010, in .NET, C#, Windows and tagged , , . Bookmark the permalink. Leave a comment.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s