Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Genel bakış
İş akışlarında yürütücüler genellikle durum bilgili olur; örneğin, iletileri biriktirebilir, işlem sayılarını izleyebilir veya ara sonuçları önbelleğe alabilirler. Bir iş akışı paylaşılan yürütücü örnekleriyle birden çok çalıştırmada yeniden kullanıldığında, önceki çalıştırmadan kalan durum sonraki çalıştırmalara sızarak beklenmeyen davranışlara veya veri bozulmasına neden olabilir.
Arabirim, IResettableExecutor yürütücülerin çalıştırmalar arasında iç durumlarını temizlemeleri için bir sözleşme sağlayarak bu sorunu çözer. İş akışı çalışma zamanı, bir çalıştırma tamamlandığında paylaşılan yürütücü örnekleri üzerinde ResetAsync()'ü otomatik olarak çağırarak bir sonraki çalıştırma için sorunsuz bir başlangıç sağlar.
Sorun
bir iş akışı çalıştırması sırasında iletileri toplayan bir yürütücü düşünün:
internal sealed partial class AggregationExecutor() : Executor("AggregationExecutor")
{
private readonly List<string> _messages = [];
[MessageHandler]
private async ValueTask HandleAsync(string message, IWorkflowContext context)
{
this._messages.Add(message);
// Process aggregated messages...
}
}
Bu yürütücü iş akışı çalıştırmaları arasında paylaşılıyorsa, _messages önceki çalıştırmadaki verileri korur. İkinci çalıştırmada, buna ait olmayan eski iletiler gösterilir.
IResettableExecutor Arayüzü
IResettableExecutor , iş akışı çalışma zamanının çalıştırmalar arasında çağırdığı tek bir yöntemi tanımlar:
public interface IResettableExecutor
{
ValueTask ResetAsync();
}
Bir yürütücü bu arabirimi uyguladığında, çalışma zamanı her çalıştırmadan sonra güvenli bir şekilde sıfırlayabilir ve iş akışının eski durum olmadan yeniden kullanılmasına olanak tanır.
IResettableExecutor'ı Uygulamak
Durum bilgisi olan bir yürütümcünün sıfırlanabilir olmasını sağlamak için arabirimi uygulayın ve
internal sealed partial class AggregationExecutor()
: Executor("AggregationExecutor"), IResettableExecutor
{
private readonly List<string> _messages = [];
[MessageHandler]
private async ValueTask HandleAsync(string message, IWorkflowContext context)
{
this._messages.Add(message);
// Process aggregated messages...
}
public ValueTask ResetAsync()
{
this._messages.Clear();
return default;
}
}
Sıfırlanabilir yürütücüler kullanan bir iş akışının tam çalışma örneği için bkz. WorkflowAsAnAgent örneği.
Uygulama Zamanları
Tüm yürütücüler IResettableExecutor uygulamak zorunda değildir. Bu karar kılavuzunu kullanın:
| Scenario | Uygulamak? | Nedeni |
|---|---|---|
| Yürütücü değiştirilebilir duruma (listeler, sayaçlar, önbellekler) sahiptir ve çalıştırmalar arasında paylaşılır | Evet | Bir yürütmedeki durum bir sonrakine sızabilir |
| Yürütücü durumsuz | Hayır | Sıfırlanması gereken bir şey yok |
| Her iş akışı için yürütücü fabrika yöntemiyle yeni oluşturulur. | Hayır | Her çalıştırma, temiz bir duruma sahip yeni bir örnek oluşturur. |
Yürütücü, farklı yürütme süreçleri arasında paylaşılabilir olarak tanımlanmıştır (declareCrossRunShareable: true) |
Hayır | Çapraz çalıştırılabilen paylaşılabilir yürütücüler sıfırlanmadan eşzamanlı kullanımı destekler |
Uyarı
Paylaşılan bir durum bilgisi yürütücüsü IResettableExecutor gerçekleştirmezse, iş akışını yeniden kullanma işlemi bir InvalidOperationException oluşturur:
"Cannot reuse Workflow with shared Executor instances that do not implement IResettableExecutor."
Çalışma Zamanı Sistemi Bunu Nasıl Kullanır?
İş akışı çalışma zamanı, sıfırlama yaşam döngüsünü otomatik olarak yönetir.
ResetAsync()'yi kendiniz çağırmanıza gerek yok. Sıra şu şekildedir:
- Sahiplik edinildi — bir iş akışı çalışması başladığında, çalışma zamanı iş akışı örneğinin sahipliğini alır ve hangi yürütücülerin sıfırlanması gerektiğini not eder.
- Çalıştırma işlemi — yürütücüler iletileri işler ve durumu biriktirebilir.
-
Sahiplik serbest bırakıldı — çalışma tamamlandığında (veya çöpe atıldığında), çalışma zamanı sahipliği serbest bırakır ve
ResetAsync()uygulayan tüm paylaşılan yürütücü örneklerindeIResettableExecutorçağrısı yapılır. - Yeniden kullanıma hazır — başarılı bir sıfırlamadan sonra iş akışı yeni bir çalıştırma için kullanılabilir.
Paylaşılan yürütücülerden herhangi biri sıfırlanamazsa (arabirimi uygulamadığından), iş akışı yeniden kullanılamaz olarak işaretlenir ve sonraki çalıştırmalar oluşturulur.
Durum Yalıtımıyla İlişki
IResettableExecutor
Durum Yönetimi'nde açıklanan yardımcı yöntem desenini tamamlar. İki yaklaşım farklı ihtiyaçlara hizmet eder:
- Yardımcı yöntemler (çalıştırma başına yeni örnekler oluşturma) en güçlü yalıtım garantilerini sağlar ve varsayılan yaklaşım olarak önerilir.
-
IResettableExecutor, yürütücü örneklerini çalıştırmalar arasında paylaşmanız gerektiğinde (örneğin yürütücü oluşturma pahalı olduğunda veya bir iş akışı aracı olarak kullanıma sunulduğunda ve birden çok çağrıda yeniden kullanıldığında) yararlıdır.
Senaryonuza en uygun yaklaşımı seçin. Çoğu iş akışı için yardımcı yöntemler yeterlidir. Örnekleri paylaşmak kasıtlı bir tasarım seçimi olduğunda IResettableExecutor kullanın.
Bu kavram Python için geçerli değildir. Tam durum yalıtımı için her bağımsız çalıştırma için yeni iş akışı ve yürütücü örnekleri oluşturun. Desenler ve örnekler için bkz. Durum Yönetimi .