【问题标题】:Recycle WorkflowServiceHost class for versioned workflow. WF 4为版本化工作流回收 WorkflowServiceHost 类。 WF 4
【发布时间】:2011-02-23 19:39:51
【问题描述】:

我的情况如下: 工作流 XAML 存储在数据库中,然后我从中创建 WorkflowServiceHost 并且客户端可以调用它。在此之前没问题:我在端点 1 有 XAML1。

稍后用户更改 xaml。据我从其他问题中了解到,解决方案是保留 XAML1,并存储新的 XAML2,并启动一个新的 WorkflowServiceHost。 所以最终得到了 XAML1/XAML2 的端点 1/端点 2,客户端可以决定以某种方式调用哪个。

最后我的问题是,有没有办法以某种方式检测第一个 WorkflowServiceHost 内部没有挂起的实例?我的意思是所有工作流程都在内部完成,您可以安全地处置该服务主机。

在最坏的情况下,我可能会使用自定义跟踪参与者来记录实例是否正在运行,但也许还有其他方式......

// activity comes from xaml
var jobHost = new WorkflowServiceHost(activity, new Uri("net.pipe://localhost/WorkflowHost"));
jobHost.AddServiceEndpoint("IWorkflowHost", new System.ServiceModel.NetNamedPipeBinding(), "Job1");
// extensions
// behaviors
jobHost.Description.Behaviors.Add(_instanceStore);
jobHost.Open();

【问题讨论】:

    标签: .net workflow-foundation workflow-foundation-4


    【解决方案1】:

    [System.Activities.DurableInstancing].ServiceDeployments 视图将为您创建的每个端点包含一条记录。它的主键 ServiceDeploymentId 是 [System.Activities.DurableInstancing].Instances 视图中的外键,其中包含每个工作流实例的记录。从那里应该是一个简单的 SQL 查询来查找没有相关工作流实例的端点。

    【讨论】:

    • 在 ServiceDeployments 视图中看不到任何记录,Instances 视图有持久化 wf 的记录,但 ServiceDeploymentId 列为空。我已经从代码创建了 WorkflowServiceHost,请参阅原始帖子。你有什么建议吗?
    • 根据 Reflector,使用了 VirtualPathExtension,并且似乎没有在自托管场景中添加。不幸的是,构造函数是内部的而不是公开的。
    • 您如何看待自定义跟踪表,每个工作流实例一条记录?自定义跟踪参与者可以在这里登录,包括实例状态、xaml 版本、端点版本。稍后的 SQL 查询可以决定哪个端点不是“活动的”,没有正在运行的实例并关闭该主机类。
    【解决方案2】:

    如果您只是调用 Workflow 一次然后将其释放,您可以监听 WorkflowServiceHost 的 Closed 事件。

    svchost.Closed += SomeMethod;
    
    private void SomeMethod(object sender, EventArgs e)
    {
        // do something after WorkflowServiceHost has closed...
    }
    

    【讨论】:

    • 我在 WorkflowServiceHost 中有一些长时间运行(几天)的实例,所以无法关闭它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多