让我们有一个工作流程,包括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();
现在我将消息发送到工作流程 并且运行时创建第一个工作流实例。 当然,相关键包含在消息中。 工作流程继续延迟活动 并保存到数据库并卸载。
我们假设延迟足够长,我会发送下一条消息 具有完全相同的相关键。怎么了? 这两个工作流程都不会从延迟中醒来,也永远不会完成。
我错了什么? 为什么工作流运行时不能保护我不受此影响? 有没有办法如何拯救两个工作流实例?
感谢您的帮助!
答案 0 :(得分:2)
如果使用邮件关联,则邮件中的键值必须与单个活动工作流程匹配。如果您尝试使用相同的密钥启动第二个工作流,则在尝试启动新实例时会出现异常。现在,如果您只使用没有SendReply的Receive,那么您正在创建单向消息传递方案,并且无法将SOAP故障发送回客户端。因此客户端可能不会意识到错误。如果在服务中启用跟踪并检查日志文件,仍可以看到此信息。但是,更简单的选择是包含SendReply,即使您没有正常响应,因为这会产生包含故障消息的响应消息。