Workflow Foundation:从未完成延迟活动

时间:2010-06-04 05:40:42

标签: workflow-foundation-4

让我们有一个工作流程,包括Receive活动,然后是Delay活动。 接收活动已CanCreateInstance = true 并且还提供了查询(消息)相关性。 工作流程托管在工作流程服务中 并在空闲时立即保存到数据库中。

WorkflowService service = new WorkflowService
{
  Name = "MyWorkflow",
  Body = new MyWorkflow(),
  Endpoints =
  {
    new Endpoint
    {
      ServiceContractName = "IMyWorkflow",
      AddressUri = new Uri("http://localhost:1234/MyWorkflow"),
      Binding = new BasicHttpBinding()
    }
  }
};

WorkflowServiceHost host = new WorkflowServiceHost(service);
string conn = "Data Source=...;Initial Catalog=...";
host.DurableInstancingOptions.InstanceStore = new SqlWorkflowInstanceStore(conn);
host.Open();

现在我将消息发送到工作流程 并且运行时创建第一个工作流实例。 当然,相关键包含在消息中。 工作流程继续延迟活动 并保存到数据库并卸载。

我们假设延迟足够长,我会发送下一条消息 具有完全相同的相关键。怎么了? 这两个工作流程都不会从延迟中醒来,也永远不会完成。

我错了什么? 为什么工作流运行时不能保护我不受此影响? 有没有办法如何拯救两个工作流实例?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

如果使用邮件关联,则邮件中的键值必须与单个活动工作流程匹配。如果您尝试使用相同的密钥启动第二个工作流,则在尝试启动新实例时会出现异常。现在,如果您只使用没有SendReply的Receive,那么您正在创建单向消息传递方案,并且无法将SOAP故障发送回客户端。因此客户端可能不会意识到错误。如果在服务中启用跟踪并检查日志文件,仍可以看到此信息。但是,更简单的选择是包含SendReply,即使您没有正常响应,因为这会产生包含故障消息的响应消息。