我们正在尝试加载和恢复有延迟的工作流程。我已经看到Microsoft使用store.WaitForEvents和LoadRunnableInstance来加载工作流的绝对延迟示例。但是,此处的工作流程已为人所知。
在我们的例子中,我们希望有一个事件等待store.WaitForEvents每隔5秒后检查是否有可运行的实例,如果只是加载并运行那个/那些特定的实例。有没有办法让我知道哪个工作流实例已准备就绪。
我们在数据库中维护工作流ID和与之关联的xaml,因此,如果我们知道工作流实例ID,我们可以将xaml映射到它,创建工作流,然后对其执行LOadRunnableInstance。
非常感谢任何帮助。
Microsoft示例(绝对延迟)
public void Run(){
wfHostTypeName = XName.Get("Version" + Guid.NewGuid().ToString(),
typeof(WorkflowWithDelay).FullName);
this.instanceStore = SetupSqlpersistenceStore();
this.instanceHandle =
CreateInstanceStoreOwnerHandle(instanceStore, wfHostTypeName);
WorkflowApplication wfApp = CreateWorkflowApp();
wfApp.Run();
while (true)
{
this.waitHandler.WaitOne();
if (completed)
{
break;
}
WaitForRunnableInstance(this.instanceHandle);
wfApp = CreateWorkflowApp();
try
{
wfApp.LoadRunnableInstance();
waitHandler.Reset();
wfApp.Run();
}
catch (InstanceNotReadyException)
{
Console.WriteLine("Handled expected InstanceNotReadyException, retrying...");
}
}
Console.WriteLine("workflow completed.");
}
public void WaitForRunnableInstance(InstanceHandle handle)
{
var events=instanceStore.WaitForEvents(handle, TimeSpan.MaxValue);
bool foundRunnable = false;
foreach (var persistenceEvent in events)
{
if (persistenceEvent.Equals(HasRunnableWorkflowEvent.Value))
{
foundRunnable = true;
break;
}
}
if (!foundRunnable) {
Console.WriteLine("no runnable instance");
}
}
由于
Anamika
答案 0 :(得分:2)
我在持久延迟活动和WorkflowApplicationHost方面遇到了类似的问题。结束创建我自己的“延迟”活动,其工作方式基本上与开箱即用的方式相同,(采用描述何时恢复工作流程的arg,然后书签本身)。虽然我没有在SqlInstanceStore中保存延迟信息,但是我的延迟活动在单独的数据库中创建了一条记录。 (类似于您用来跟踪工作流程ID和Xaml的那个)。然后我编写了一个简单的服务,该服务轮询该数据库是否存在过期延迟,并启动了必要工作流程的简历。
哦,延迟活动在书签恢复时从该数据库中删除了它的记录。
HTH
答案 1 :(得分:0)
我建议为您正在托管的每个工作流定义设置一个单独的SqlPersistenceStore。