2009-08-18 75 views
2

這似乎是一個基本的問題,但我找不到任何地方的答案:工作流持久性多個工作流

我有幾個不同類型的長期運行的狀態機工作流的,我與跨多個主機應用工作與中央數據庫。我正在使用SqlWorkflowPersistenceService來堅持它們。所以說我有三種工作流類型WorkflowOne,WorkflowTwo和WorkflowThree。每個用戶的實例都由一個用戶啓動並保存到數據庫。另一位用戶出現並希望進行各種更改,因此他們啓動應用程序。現在我可以使用持久性服務給我一個所有持久化實例的列表,但是如何知道哪些是WorkflowOne類型,哪些是WorkflowTwo或WorkflowThree?

回答

4

有幾種方法可以做到這一點。

第一種選擇是使用WorkflowPersistenceService本身做這樣的事情:

var persistenceService = new SqlWorkflowPersistenceService("<<connection string>>"); 
var persistedWorkflows = persistenceService.GetAllWorkflows(); 
foreach (var persistedWorkflow in persistedWorkflows) 
{ 
    var workflowInstance = workflowRuntime.GetWorkflow(persistedWorkflow.WorkflowInstanceId); 
    var workflowDefinition = workflowInstance.GetWorkflowDefinition(); 
    Console.WriteLine(workflowDefinition.GetType().FullName); 
} 

簡單,因爲已經在使用SqlWorkflowPersistenceService做的,但它具有所有工作流實例加載到內存中,你的缺點負責將它們從內存中移除。

第二個選擇是使用工作流程追蹤:

var trackingQuery = new SqlTrackingQuery("<<connection string>>"); 
    var queryOptions = new SqlTrackingQueryOptions() 
    { 
     WorkflowStatus = WorkflowStatus.Running 
    }; 
    var runningWorkflows = trackingQuery.GetWorkflows(queryOptions); 
    foreach (var runningWorkflow in runningWorkflows) 
    { 
     Console.WriteLine(runningWorkflow.WorkflowType); 
    } 

的優點是你不需要加載實際的工作流定義到內存只是爲了檢查它的類型。缺點是你必須添加SqlTrackingService以及它自己的數據庫增加了複雜性和開銷。

+0

謝謝,莫里斯。我基本上實現了第一個選項。儘管我認爲第二個使用跟蹤更多的是我。我想我們可能最終會使用跟蹤,在這種情況下,我會實施該選項。再次感謝! – 2009-08-19 23:24:29

0

不知道這是否是最好的方式,但只是保溼每個WF實例,然後比較它的Name屬性,看看是否是我正在尋找的實例。

+0

我會離開這幾天,看看是否有其他人有更好的方法。還想過創建我自己的持久性服務,只是增加另一個字段到InstanceState表來保存類型,但認爲這有點矯枉過正。 – 2009-08-18 23:16:18