我有一个 Windows 服务,正在运行工作流程。工作流程是从数据库加载的 XAML(用户可以使用重新托管的设计器定义自己的工作流程)。它配置有一个 SQLWorkflowInstanceStore 实例,以便在空闲时保留工作流。 (它基本上源自 Microsoft 的 WCF/WF 示例的 \ControllingWorkflowApplications 中的示例代码)。
但有时我会收到如下错误:
System.Runtime.DurableInstancing.InstanceOwnerException: InstancePersistenceCommand 的执行被中断,因为所有者 ID 'a426269a-be53-44e1-8580-4d0c396842e8' 的实例所有者注册已变得无效。此错误表明该所有者锁定的所有实例的内存中副本已过时,应与 InstanceHandles 一起丢弃。通常,最好通过重新启动主机来处理此错误。
我一直在努力寻找原因,但在开发中很难重现,但在生产服务器上,我偶尔会遇到它。我发现的一个提示:当我查看 LockOwnersTable 时,我发现 LockOnwersTable lockexpiration 设置为 01/01/2000 0:0:0 并且它不再更新,而在正常情况下,应该根据每 x 秒更新一次主机锁续订期...
那么,为什么 SQLWorkflowInstanceStore 会停止更新此 LockExpiration 以及如何检测其原因?
发生这种情况是因为有程序在后台运行,并尝试每 30 秒延长实例存储的锁定,并且似乎一旦连接到 SQL 服务失败,它就会将此实例存储标记为无效。
如果从 [LockOwnersTable] 表中删除实例存储记录,您会看到相同的行为。
建议的解决方案是,当引发此异常时,您需要释放旧实例存储并初始化一个新实例存储
public class WorkflowInstanceStore : IWorkflowInstanceStore, IDisposable
{
public WorkflowInstanceStore(string connectionString)
{
_instanceStore = new SqlWorkflowInstanceStore(connectionString);
InstanceHandle handle = _instanceStore.CreateInstanceHandle();
InstanceView view = _instanceStore.Execute(handle,
new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));
handle.Free();
_instanceStore.DefaultInstanceOwner = view.InstanceOwner;
}
public InstanceStore Store
{
get { return _instanceStore; }
}
public void Dispose()
{
if (null != _instanceStore)
{
var deleteOwner = new DeleteWorkflowOwnerCommand();
InstanceHandle handle = _instanceStore.CreateInstanceHandle();
_instanceStore.Execute(handle, deleteOwner, TimeSpan.FromSeconds(10));
handle.Free();
}
}
private InstanceStore _instanceStore;
}
您可以在此链接中找到创建实例存储句柄的最佳实践工作流实例存储最佳实践 http://www.morganskinner.com/2015/01/self-hosting-workflowworking-with.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)