2011-01-13 275 views
0

我有一个工作流已启动并持续使用消息传递活动。 如果它们在几秒钟内发送,Start start命令和Stop final命令之间的关联就可以正常工作。当工作流卸载 问题开始,因为下面的停止消息引发以下的FaultException:加载持久化工作流时出错

如果未指定LoadWorkflowByInstanceKeyCommand.AssociateLookupKeyToInstanceId,则LookupInstanceKey必须已经关联到一个实例,或LoadWorkflowByInstanceKeyCommand将失败。由于这个原因,如果没有设置AssociateLookupKeyToInstanceId,在InstanceKeysToAssociate集合中指定LookupInstanceKey也是无效的

任何人都可以帮助我吗? 工作流中的变量属于int和XDocument类型。 这是初始化WorkflowServiceHost中的代码:

WorkflowServiceHost serviceHost = new WorkflowServiceHost(myWorkflow, new Uri(serviceUri)); 
      ServiceDebugBehavior debug = serviceHost.Description.Behaviors.Find<ServiceDebugBehavior>(); 
      if (debug == null) 
      { 
       debug = new ServiceDebugBehavior(); 
       serviceHost.Description.Behaviors.Add(debug); 
      } 

      debug.IncludeExceptionDetailInFaults = true; 
      WorkflowIdleBehavior idle = serviceHost.Description.Behaviors.Find<WorkflowIdleBehavior>(); 
      if (idle == null) 
      { 
       idle = new WorkflowIdleBehavior(); 
       serviceHost.Description.Behaviors.Add(idle); 
      } 

      idle.TimeToPersist = TimeSpan.FromSeconds(2); 
      idle.TimeToUnload = TimeSpan.FromSeconds(10); 
      var behavior = new SqlWorkflowInstanceStoreBehavior 
      { 
       ConnectionString = ConfigurationManager.ConnectionStrings["WorkflowPersistence"].ConnectionString, 
       InstanceEncodingOption = InstanceEncodingOption.None, 
       InstanceCompletionAction = InstanceCompletionAction.DeleteAll, 
       InstanceLockedExceptionAction = InstanceLockedExceptionAction.BasicRetry, 
       HostLockRenewalPeriod = new TimeSpan(00, 00, 30), 
       RunnableInstancesDetectionPeriod = new TimeSpan(00, 00, 05) 
      }; 
      serviceHost.Description.Behaviors.Add(behavior); 
      serviceHost.Open(); 

望着数据库,它似乎是工作流从未暂停过。

任何帮助表示赞赏, 谢谢

回答

0

不能确定这到底是怎么回事,但它听起来像有工作流不能被序列化,防止工作流程被存储到磁盘使用的类型。当你说“查看数据库时,似乎工作流程永远不会被暂停。”你真的意味着暂停吗?你为什么期望工作流被暂停?

如果您只将启动消息发送到工作流并等待2秒,会发生什么情况?你在持久性数据库中有新的记录吗?

+0

对于挂起,我的意思是它进入RunnableInstancesTable表,并且IsSuspended的值在InstancesTable表中设置为1。 可以将工作流程序列化,因为如果我添加延迟,它会正确挂起。 问题是在WorkflowIdleBehavior.TimeToUnload过去之后,工作流程不会暂停,并且对Stop操作的调用将引发所述的错误。如果在TimeToUnload超时之前发送停止操作,则不会引发该错误。 这是一个长时间运行的工作流程。 – fra 2011-01-13 14:22:24

相关问题