2009-08-18 5 views
2

Это кажется элементарным вопросом, но я не могу найти ответ в любом месте:Workflow Постоянства для нескольких рабочих процессов

У меня есть несколько различных типов долгоиграющих машины состояний рабочих процессов, которые я работаю с несколькими серверных приложениями с центральной базой данных. Я использую 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

Спасибо, Морис. В основном я реализовал первый вариант. Второй, использующий отслеживание, больше того, что я получаю, хотя думаю. Я думаю, что мы, вероятно, закончим использование отслеживания в любом случае, и в этом случае я реализую этот вариант. Еще раз спасибо! –

0

Не уверен, что это лучший способ, но я просто увлажняю каждый экземпляр WF, а затем сравниваю его свойство Name, чтобы узнать, является ли это экземпляром, который я ищу.

+0

Я оставлю это открытым на пару дней, чтобы узнать, есть ли у кого-нибудь лучший способ. Также подумал о создании моей собственной службы сохранения и просто добавлении другого поля в таблицу InstanceState для хранения типа, но думал, что это своего рода перебор. –