gpt4 book ai didi

persistence - WF4 InstancePersistenceCommand 中断

转载 作者:行者123 更新时间:2023-12-02 02:02:21 25 4
gpt4 key购买 nike

我有一个 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;
}

您可以在此链接中找到创建实例存储句柄的最佳实践 Workflow Instance Store Best practices

关于persistence - WF4 InstancePersistenceCommand 中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16639055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com