“在状态持久性存储中找不到 ID 为“XXXXXXXXXXXXXXXXX”的工作流。”报错原因

在状态机工作流中加载持久化服务SqlWorkflowPersistenceService时,在构造函数中如果设置unloadOnIdle参数为true,也就是要在工作流在空闲时自动持久化并从内存中卸载,经常会报一个类似于“在状态持久性存储中找不到 ID 为“e8d00371-df0f-4bfb-97f1-75f4556da1a7”的工作流。”这样的错误。在网上查找相关信息,有人说这是SqlWorkflowPersistenceService的在自动持久化时的一个Bug,于是将自动改为手动,手动在工作流进入空闲的事件中加入卸载的代码。

 

workflowRuntime.WorkflowIdled += new EventHandler<System.Workflow.Runtime.WorkflowEventArgs>(workflowRuntime_WorkflowIdled);

 

private void OnWorkflowIdled(object sender, WorkflowEventArgs e)
    {
        e.WorkflowInstance.TryUnload();
    }

 

手动持久化后再试发现报了另外一个错误:“服务器 'XX' 上的 MSDTC 不可用。”于是到Windows服务中找到了一个名称为“Distributed Transaction Coordinator”的服务就是这个MSDTC服务,果然没有启动,尽管是“手动”可它并没有在需要的时候自动启动。将这个服务启动后,工作流的程序运行正常了,不再报错。这时我想到如果再将手动持久化改为自动会如何?于是改为自动持久化,并将上边的//e.WorkflowInstance.TryUnload();注销掉。结果依然正常,没有报“在状态持久性存储中找不到工作流”的错误。

 

得出结论,报错的原因不是SqlWorkflowPersistenceService自动持久化的Bug,而是MSDTC服务被禁用或者启动失败。这个服务在设置和显示上还有些古怪,具体就不说了,也许是个个例。

 

还有人说出现这个问题是没有将一些类设置为可序列化的[Serializable],如果MSDTC服务已经启动仍然有这个问题,可以检查一下相关的类、枚举等是否已经被标记为[Serializable]。

 

我觉得想要持久化所有相关类、枚举等标记[Serializable]是必须的,而想要自动持久化MSDTC服务又是必须的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值