WF - Hosting, Runtime, Listing Service...


Merhaba Arkadaşlar;

Workflow Hosting

Workflow bir uygulama değil, çalışma zamanıdır. Bir ana bilgisayar işlemi yüklemeniz gerekir ve bir workflow başlamadan önce iş akışı zamanı başlatmalısınız. Ana bilgisayar işlemi, çalışma zamanına hangi workflow tiplerini oluşturması gerektiğini söyler ve çalışma zamanı workflowun çalışma döngüsünü yönetir ve workflow tamamlama ve sonlandırma gibi önemli yaşam döngüsü olayları hakkında ana bilgisayar işlemi bildirir. Çalışma zamanı içinde barınan türler hakkında değildir. Ana bilgisayar işlemi, bir ofis masaüstü bilgisayarında çalışan bir akıllı istemci uygulaması veya bir veri merkezinin sunucu üzerinde çalışan bir ASP.NET süreci olabilir.Tüm ana süreçlerin ihtiyacı, .NET 3.0 Workflow çevirisinin yüklenmesidir.

Bir ev sahibi, çalışma zamanının özellik temelini ayarını, ek özelliklerle katmerleyerek workflow çalışma zamanını uyarlayabilir. Bu hizmetler, uzun soluklu workflowlar için devamlılık sağlar, izleme workflowun görüntülenmesini sağlar ve daha fazlasını. Önceki bölümlerde kullandığımız ExternalDataExchangeService’i tekrar çağırın. Bir workflow ile ana bilgisayar işlemi arasında iletişimi sağlaması için çalışma zamanına bu servisi ekledik .Tüm uygulamalar bu özelliği gerektirmez, bu yüzden servis bizim özel olarak ihtiyaç duyduğumuz bir bileşendir.

Bu bölümde, Windows Workflow çalışma zamanı ve mevcut hizmetleri de daha yakından tanıyacağız. Workflow çalışma zamanı için uygun olan, hata kaydetme, izleme ve yapılandırma seçenekleri ile başlayacağız. Sonra, çalışma zamanına workflowu yürüteceği kanalları sunan şift servisine bakacağız. Ayrıca, dayanıklı depolamayı sağlayan ve workflowla ilgili bilgileri depolayan devamlılık servisini gözden geçireceğiz. Son olarak da, workflow yürütmesini görüntüleyen izleme servisini inceleyeceğiz.

Workflow Çalışma Zamanı

Geçmiş bölümlerde çalışma zamanını kullandık, şimdi tüm bunları tekrar gözden geçirelim. WorkflowRuntime sınıfı Windows Workflow’a açılan ana kapıdır. Ev sahibi(host) sınıfların örneklerini yaratır ve sonra aşağıdaki tabloda belirtilen olaylara abone olur. Çalışma zamanı yürütülürken, olay rapor durumu tüm workflowlar için değişir.

İsim                                                Meydana Getirdiği

WorkflowAborted                   Örnek durduğunda

WorkflowComplated               Örnek tamamlandığında

WorkflowCreated                    Başarılı bir CreateWorkflow çağırıldığında

WorkflowIdled                                   Workflow boşta olduğu zaman

WorkflowLoaded                       Bir devamlılık servisi workflowu yenilediğinde

WorkflowPersisted                 Bir devamlılık servisi workflowu kaydettiğinde

WorkflowResumed                 Askıdan sonra workflowun yürütülmesine devam edildiğinde

WorkflowStarted                    Workflow ilk yürütmesine başladığında

Çalışma zamanı oluşturmak ve olaylara abonelik için kullanılan kod çok basittir. Aşağıdaki örnek çalışma zamanını oluşturur, WorkflowCompleted ve WorkflowTerminated olaylarına abone olur ve yeni workflow örneğini yürütür.

using(WorkflowRuntime runtime = new WorkflowRuntime())

using(AutoResetEvent reset = new AutoResetEvent(false))

{

runtime.WorkflowCompleted += delegate { reset.Set(); };

runtime.WorkflowTerminated += delegate { reset.Set(); };

runtime.StartRuntime();

WorkflowInstance instance;

instance = runtime.CreateWorkflow(typeof(SimpleWorkflow));

instance.Start();

reset.WaitOne();

}

WorkflowRuntime sınıfı, ortamı ve iş akışlarını yönetmek için yukarıda görülen CreateWorkflow ve StartRuntime yöntemleri gibi umumi yöntemler sunar.Bu metotlar çalışma zamanını başlatır, durdurur, workflow’lar yaratır, workflow’lara erişir ve çalışma zamanına servis ekleyip çıkarır. Daha sonra bu metotları ayrıntılı bir şekilde ele alacağız.

Tipik olarak, sadece bir workflow yürütmek için çalışma zamanı oluşturulmaz. Birçok uygulamada, çalışma zamanı prosesin hayatı ve birden çok workflow yürütmek için saklanır. Ancak, yapılandırma ve WF çalışma zamanının günlüğü özelliklerini göstermek için basit bit kodu kullnacağız.

Workflow Çalışma Zamanı Günlüğü

.NET iskeleti System.Diagnostics adalanında bir izleme API’si sunar. Workflow bu API’yi çalışma zamanında neler olduğunu tutmak için kullanır. İz bilgiler, umumi WorkflowRuntime sınıfından alınan bilgilere göre daha detaylıdır. İz bilgilerini almak için workflow çalışma zamanında bir veya birden fazla iz kaynağı oluşturmamız lazım.

Beş tane iz kaynağı WF’de mevcuttur. Her iz kaynağı Windows Workflow’un  farklı bir fonksiyonel alanından tanısal bilgi sağlar. Biz, bu kaynaklar kod ile ya da yapılandırma dosyası ile etkinleştirebiliriz. 

Aşağıdaki yapılandırma dosyası beş iz kaynağını yapılandırır:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<system.diagnostics>

<switches>

<add name="System.Workflow.Runtime" value="All" />

<add name="System.Workflow.Runtime.Hosting" value="All" />

<add name="System.Workflow.Runtime.Tracking"

value="Critical" />

<add name="System.Workflow.Activities" value="Warning" />

<add name="System.Workflow.Activities.Rules" value="Off" />

<add name="System.Workflow LogToFile" value="1" />

</switches>

</system.diagnostics>

</configuration>

<switches> bölümü içinde, her iz kaynağının adını görürüz. Her kaynak, farklı bir alandan bilgi sağlar; örneğin, bir workflow bir kural seti içinde kuralları değerlendirirken olduğunda, biz System.Workflow.Activities.Rules’dan gelen tanısal bilgileri görürüz.

İhtiyacımız bilgi miktarını içeren her iz kaynağını yapılandırabiliriz. Mevcut değerler: Hata(Error), Uyarı(Warning), Bilgi(Information), Kritik(Critic) ve Hepsi(All). Bir All değeri, uygun olan tüm iz bilgilerini vermesini iz kaynağına söyler. Bir kritik(Critic) değeri, sadece kritik hatalar hakkında bilgi yayınlamasını iz kaynağına söyler.

Bu bölümün(LogToFile) içinde ki son giriş, WF’ye tüm izleri günlük dosyasına göndermesini söyleyen bir iz geçişidir. Günlük dosyası WorkflowTrace.log adını alacak ve uygulamanın çalışma dizininde görünecektir. Aşağıdaki ekran görüntüsü yukarıdaki yapılandırma ile örnek kod çalıştıran günlük dosyasının içeriğini gösterir. Her çıkış satırı iz kaynağının adı ve metinsel mesajı içerir. Bu örnekte, tüm iz bilgileri System.Workflow.Runtime kaynağından geldi.

 

Visual Studio hata ayıklayıcı içindeyken, bu iz bilgileri Visual Studio Çıkış penceresinde de görünür. Başka bir hedefe giriş bilgisi göndermek isterseniz, yeni bir iz dinleyicisi oluşturabilirsiniz.  Yapılandırma dosyası veya kodu ile iz dinleyicisi oluşturabilirsiniz. :

TraceListener console;

console = new TextWriterTraceListener(Console.Out, "console");

Trace.Listeners.Add(console);

using(WorkflowRuntime runtime = new WorkflowRuntime())

using(AutoResetEvent reset = new AutoResetEvent(false))

{

// ...run the workflow

}

Yukarıdaki kodu çalıştırmadan önce, iz bilgilerini iz dinleyicisine gönderecek workflowu çalışma zamanını yapılandırmalıyız. Aşağıdaki XML’i <switches> bölümün içinde yerleştirerek tüm iz bilgilerini iz dinleyicilerine gönderebilirsiniz.

 

<add name="System.Workflow LogToTraceListeners" value="1" />

Tanılama ve izleme sadece çalışma zamanının özellikleri değidirl. Şimdi çalışma zamanı içinde hizmet yapılandırmasını inceleyeceğiz.

Workflow çalışma Zamanı Yapılandırması

Çalışma zamanına hizmet eklemek için bir zorunluluk yaklaşımı ve bildirge yaklaşım vardır:

§   Bildirimsel yaklaşım uygulamanın yapılandırma dosyasını kullanarak servisleri yapılandırır.

§   Zorunluluk yaklaşımı kod hizmet oluşturur ve WorkflowRuntime sınıfının AddService yöntemi ile çalışma zamanı ekler.

Her iki yaklaşımın örnekleri göstereceğiz ancak şimdi açıklayıcı yaklaşımın detayları bakalım.

Workflow Yapılandırma Bölümleri

. NET yapılandırma sisteminde, farklı bölüm işleyicileri yapılandırma dosyasının farklı bölümleri yönetir. WF uzman yapılandırma bölümü ele almak için WorkflowRuntimeSection sınıfını sağlar. Aşağıdaki, bir bölümü işleyicisi yapılandıran ve WF çalışma zamanı başlatmak için bir bölüm sunan bir bölüm yapılandırma dosyasıdır:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<configSections>

<section

name="MyRuntime"

type="System.Workflow.Runtime.Configuration.

WorkflowRuntimeSection, System.Workflow.Runtime,

Version=3.0.00000.0, Culture=neutral,

PublicKeyToken=31bf3856ad364e35"/>

</configSections>

<MyRuntime>

<CommonParameters>

<!-- add parameters used by all services -->

</CommonParameters>

<Services>

<!-- add services -->

</Services>

</MyRuntime>

</configuration>

 

WorkflowRuntime runtime = new WorkflowRuntime("MyRuntime")

NOT:Bir konfigürasyon dosyası içinde birden fazla iş akışı yapılandırma bölümleri yerleştirebiliriz. Her bölümde, bir iş akışı yapılandırma bölümü element adıyla eşleşen ve isim niteliği ile tanımlanan bir bölüm işleyici gerekir. Bu bölüm işleyicisi için type niteliği her zaman WorkflowRuntimeSection sınıfın tam adıdır.

Bir uygulama içinde birden fazla workflow çalışma zamanı başlatmak mümkündür. Biz birden fazla yapılandırma bölümleri vererek her çalışma zamanını farklı yapılandırılabilir.  Birden fazla çalışma zamanı kullanma becerisi, workflowların farklı uygulama ortamı istediğinde yararlıdır. Bir sonraki bölümde workflow listeleme servisinden bahsederken bir örneğini göreceğiz.

 

Listeleme Servisi

WF’deki çizelgeleme hizmetleri yürütme kanalları üzerinde workflow düzenlemelerinden sorumludur. WF tarafından sağlanan iki planlama hizmetleri DefaultWorkflowSchedulerService ve ManualWorkflowSchedulerService’dir. Biz açık bir zamanlama hizmet yapılandırmayacaksak, çalışma zamanı varsayılan listeme servisini (DefaultWorkflowSchedulerService) kullanacaktır. Her iki sınıfda WorkflowSchedulerService sınıfından türetilmiştir. Bu temel sınıftan kendi sınıf türetebiliriz ve  özel planlama mantığı gerekirse kendi sanal yöntemleri geçersiz kılar.

 

Workflow çalışma zamanı Listeleme ve İptal yöntemleri worfklow yürütme planı için çağırır. Varsayılan listeleme hizmeti workflow süreci çapında CLR kanal havuzundan konular üzerinde çalışacak şekilde planlar. Bu workflowlar, varsayılan bir arka plan kanalı üzerinde asenkronize yürütmek ve neden örnek workflow, bir AutoResetEvent ile ana kanalını engelleyerek bitirmesini bekler. Elle listeleme hizmetini kullanarak workflowa bir kanal bağışlarız. Çalışma zamanı bir workflow yürütmek için bağışlanan kanalı kullanır. Eşzamanlı workflow çalıştırmak için elle listeleme servisini kullanabilirsiniz.

 

Listeleme Servisleri Ve Kanallar

İçeride tek bir kod aktivite ile basit bir worklow atalım. Kod aktivitesi arka sayfada gösterilen kod-yanında sınıfından bir metot çağırır.

public partial class SimpleWorkflow : SequentialWorkflowActivity

{

private void codeActivity1_ExecuteCode(object sender,

EventArgs e)

{

Console.WriteLine("Hello from {0}", this.QualifiedName);

Console.WriteLine(" I am running on thread {0}",

Thread.CurrentThread.ManagedThreadId);

}

}

İki zamanlama hizmeti arasındaki farkı görmek için,bir kez elle listeleme ile bir kez de varsayılan listeleme ile bu basit workflow çalıştıracağız.  Aşağıdaki kod daha önce yazdığımız örnek workflow sürücünün yerini alacak. Bu örnekte, kodu (zorunlu yapılandırma yaklaşımı) kullanarak workflow çalışma zamanına listeleme hizmetleri ekleniyor.

 

WorkflowRuntime runtime1 = new WorkflowRuntime();

WorkflowRuntime runtime2 = new WorkflowRuntime();

ManualWorkflowSchedulerService scheduler;

scheduler = new ManualWorkflowSchedulerService();

runtime1.AddService(scheduler);

WorkflowInstance instance;

instance = runtime1.CreateWorkflow(typeof(SimpleWorkflow));

Console.WriteLine("Setting up workflow from thread {0}",

Thread.CurrentThread.ManagedThreadId);

instance.Start();

scheduler.RunWorkflow(instance.InstanceId);

instance = runtime2.CreateWorkflow(typeof(SimpleWorkflow));

instance.Start();

Bu örnekte iki aktif workflow çalışma zamanı var. Biz runtime1’i elle workflow listelemesi ile yapılandıracağız. Runtime2 yi listeleme ile değil, varsayılan listeleme kullanarak yapılandıracağız. Kodumuz herhangi bir workflowu çalıştırmadan önce mevcut kanal numarasını yazdırılır.

runtime2’de ki varsayılan listeleme servisi ile sadece Start’ı workflow örneğimiz üzerine çağırmamız gerekecek. Varsayılan listeleme otomatik olarak kanal havuzundan bir kanal üzerinden workflowu çalıştırmak için sıraya koyacaktır. Program çalıştırarak ve çıkışı gözlemleyerek farklı kanalları görebilirsiniz. Euntime1 i kullanırken, workflow programı çağırırken ki aynı kanalda yürütülecek. Runtime2 yi kullanırken workflow farklı bir kanal kullanır.

Uygulama yapılandırma dosyası kullanarak çalışma zamanlarını yürütmenin bir avantajı uygulamayı yeniden derlemeden servis ve servis parametrelerini değiştirebiliriz. Aşağıdaki yapılandırma dosyasını kullanırsak son programımız nasıl görüneceğine bir bakalım:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<configSections>

<section

name="ManualRuntime"

type="System.Workflow.Runtime.Configuration.

WorkflowRuntimeSection,System.Workflow.Runtime,

Version=3.0.00000.0, Culture=neutral,

PublicKeyToken=31bf3856ad364e35"/>

<section

name="DefaultRuntime"

type="System.Workflow.Runtime.Configuration.

WorkflowRuntimeSection, System.Workflow.Runtime,

Version=3.0.00000.0, Culture=neutral,

PublicKeyToken=31bf3856ad364e35"/>

</configSections>

<ManualRuntime>

<Services>

<add type= "System.Workflow.Runtime.Hosting.

ManualWorkflowSchedulerService,

System.Workflow.Runtime, Version=3.0.00000.0,

Culture=neutral, PublicKeyToken=31bf3856ad364e35"

useActiveTimers="true"/>

</Services>

</ManualRuntime>

<DefaultRuntime>

<Services>

<add type="System.Workflow.Runtime.Hosting.

DefaultWorkflowSchedulerService,

System.Workflow.Runtime, Version=3.0.00000.0,

Culture=neutral, PublicKeyToken=31bf3856ad364e35"

maxSimultaneousWorkflows="3" />

</Services>

</DefaultRuntime>

</configuration>

Her bölüm için bir bölüm işleyicisi ile iki workflow yapılandırma bölümleri var. ManualRuntime bölümü elle listelemeyi yapılandırır ve DefaultRuntime bölümüde varsayılan listelemeyi yapılandırır. Her servisin bir ek yapılandırma parametresi vardır. Bu parametreler incelemeye dönersiniz. Bu yapılandırma dosyasını kullanmak için kodu değiştirmemiz gerekir.

WorkflowRuntime runtime1 = new WorkflowRuntime("ManualRuntime");

WorkflowRuntime runtime2 = new WorkflowRuntime("DefaultRuntime");

WorkflowInstance instance;

instance = runtime1.CreateWorkflow(typeof(SimpleWorkflow));

Console.WriteLine("Setting up workflow from thread {0}",

Thread.CurrentThread.ManagedThreadId);

instance.Start();

ManualWorkflowSchedulerService scheduler;

scheduler = runtime1.GetService<ManualWorkflowSchedulerService>();

scheduler.RunWorkflow(instance.InstanceId);

instance = runtime2.CreateWorkflow(typeof(SimpleWorkflow));

instance.Start();

Bu kod her çalışma zamanını yapılandırma bölümüne geçerek sıfırlar. Bu koddaki birincil fark, bizim elle listeleme servisini nasıl sağladığımızdır. Açıkça örneği yaratmadığımızdan beri, çalışma zamanına bir referans sormalıyız. WorkflowRuntime sınıfının genel GetService metodu ilgili parametreyi bulup servise geri dönecek.

Listeleme Parametreleri

Her listeleme servisi, davranışı oynamak için bir parametreye sahiptir. Elle listeleme servisi yapılandırma dosyasında belirleyeceğimiz bir useAvtiveTimes parametresine sahiptir ve ya servisin yapısına bir parametre geçer. useActiveTimers yanlış(varsayılan) olduğunda, ev sahibi(host) herhangi DelayActivity dolduktan sonra workflowu sürdürmeden sorumludur. Parametresi true olduğunda, hizmet otomatik olarak iş akışı yürütülmesine devam etmek için arka plan kanal ve kullanılan bellek sayaçlarını kurar.

Süreçleri çapında CLR kanal havuzu yaratacağımız kanaldaki işçi konuları sayısına bir üst sınırı vardır. Varsayılan maksimum 25 * makinede işlemci sayısıdır. Workflowlar yüksek hacimli çalışan uygulamalar için verdiği maxSimultaneousWorkflows parametresi ile workflow çıktısı ve kanal havuzunda ücretsiz kanal durumu arasında bir denge sağlamak için gerekli olabilir. Havuzdaki açlıkla, workflowun kullandığı çok sayıdaki kanal uygulama kilitlenmelerine neden olabilir.

Doğru Listeleme Servisini Seçmek

İki listeleme hizmeti uygunsa, bariz bir soru - hangi zamanlama servisi kullanmak doğru hizmettir? En akıllı istemci uygulamaları varsayılan zamanlama servisi ile çalışacak. Windows Formları ve Windows Presentation Foundation teknolojileri ile yazılmış uygulamaları, kanal havuzu konuları üzerinde uyumsuz workflowlar yürütmek ve kullanıcı arayüzünü duyarlı tutmak isteyecektir.

Sunucu tarafında uygulamalar genellikle farklı çalışır. Bir sunucu uygulaması mümkün olduğunca az konu kullanarak en fazla sayıda müşteri isteklerini kullanmak ister. Web uygulamaları ve web hizmetleri ASP.NET çalışma zamanı kanal havuzundan konuları kullanarak HTTP isteklerini işler. Varsayılan listelemeyi kullanarak workflowı asenkron yürütme sadece istek başına ek bir kanalı bağlar. Sunucu tarafında uygulamalar genellikle elle listeleme kullanmak ve bağış talep kanal workflow yürütmesi ister.

Servisleri Devam Ettirme

Sürdürme hizmetleri, sorunları uzun zamandır devam eden workflow yürütme doğasını çözer. Birçok iş süreçlerini tamamlamak gün, hafta ve ay alır. Saymanın İspanya plajlarına dönmesini ve harcama raporu onayı beklerken biz bellekte workflow örneklerine devam edemeyiz.

Uzun zamandır devam eden workflowlar zamanlarının çoğunluğunu boşta geçirirler. Workflow bir olay HandleExternalEvent aktivitenin gelmesi için, ya da bir Delay faaliyetini bitirmeyi beklerken boş olabilir. Bir sürdürme hizmeti olduğunda, çalışma zamanı devam edebilir ve daha sonra bir boş workflow döndürür. Süreklilik uzun süreli bir depoya workflowun durumunu kaydeder. Olay nihayet geldiğinde, çalışma zamanı workflowu geri yükleyebilir ve işleme devam eder.

Çalışma zamanı, workflowun devam kararını verir, sürdürme hizmeti ise nerede ve nasıl workflowun durumunu kaydedeceğine karar verir. Çalışma zamanı bir workflow boşta gittiğinde, workflowun durumunu kaydetmek için sürdürme servisine sorar. Bir boş workflow, yürütmek için hiçbir faaliyeti olmayan, dış bir olayın gelmesini yada Delay aktivitesinin tamamlanmasını bekleyen bir workflowdur. Workflow aşağıdaki koşullara ulaştığında çalışma zamanı da bir iş akışı durumu kaydetmesi için sürdürme hizmetine soracaktır.

§   Bir TransactionScope faaliyet veya CompensatableTransactionScopeActivity faaliyet içinde bir atom işlem tamamlandığı zaman

§   Ana uygulama WorkflowInstance nesnesi üzerinde Unload veya RequestPersist yöntemlerini çağırdığı zaman

§   PersistOnClose niteliği ile özel bir etkinlik tamamlandığı zaman

§   Bir CompensatableSequence faaliyet tamamladığı zaman

§   Bir workflow sonlanıp yada tamamlandığı zaman

Son şart şaşırtıcı olabilir. Sonlanan yada tamamlanan bir workflow artık çalışmaz bu nedenle workflowu tekrar yüklemeye gerek kalmaz. Ancak, bir sürdürme servisini önceki operasyonlardan geride workflow durumu temizlemek için fırsat olarak kullanabilirsiniz. Örneğin, workflow durumunu bir veritabanı içine kaydeden sürdürme servisi, workflow çalışmayı bitirdiğinde kaydı silebilir. Alternatif olarak, bir süreklilik hizmeti gelecekte bir zamanda denetim amaçlı kullanılacak workflow durumunu saklayabilir.

Sürdürme Sınıfları

Tüm sürdürme hizmetleri WorkflowPersistenceService sınıfından türetilmiştir. Bu sınıf, eğer  özel bir sürdürme hizmet yazarsanız, uygulamanız gereken soyut yöntemleri tanımlar. Sınıfın soyut yöntemi italik olarak sonraki sayfada ekrandadır. Temel sınıf kullanımı da bir türetilen sınıf için bazı somut yöntemler sağlar. GetDefaultSerializedForm, örneğin, bir parametre ve döner serileştirilmiş faaliyet gösteren byte dizisi olarak Faaliyet kabul eder. Tüm bir workflow sıralama için biz bu yönteme workflowun kök faaliyetlerini geçmemiz gerekir.

SqlWorkflowPersistenceService - Windows Workflow kutusunun bir sürdürme hizmetini sunmaktadır. SQL sürdürme hizmeti bir Microsoft SQL Server veritabanı içine iş akışı durumu kaydeder ve bu bölümün geri kalanı için odak noktasıdır.

NOT: Bu bölüm, diğer bölümler ile desteklenerek örneklendirilmiştir. Burada temel olarak HOST mantığı ve servisleri gibi bölümlere açıklık getirilmeye çalıştım ;)

 

 







Blog Posts' Cloud