【问题标题】:WF Custom SQL Tracking Service Stopped Working for old workflows?WF 自定义 SQL 跟踪服务停止为旧工作流工作?
【发布时间】:2011-12-23 00:01:32
【问题描述】:

我有一个自定义跟踪服务,现在已经运行了一段时间,有超过 1500 个实时工作流在运行,我现在正在对工作流进行版本控制,以便我可以发布一些更改请求。

不幸的是,系统最初并未使用强类型程序集部署,所以我正在整理这个烂摊子。

我不得不混合使用自定义 SerializationBinder 来将 PublicKeyToken=null 转换为我的新 PublicKeyToken,并使用 AppDomain_AssemblyResolve 委托来帮助将主机指向现在的强类型程序集 - Referenced here

我还必须替换默认 SqlTrackingService 附带的 [Type] 表中相关行的内容以引用新的 PublicKeyToken,所以:

some.namespace.foobar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 

替换为:

some.namespace.foobar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=123456789acb

我似乎取得了不错的进展,但是当我转换状态机工作流程时,我作为服务添加的自定义跟踪服务不再针对 1.0.0.0 版工作流程触发,而是针对新创建的 2.0 版工作.0.0 工作流程。

注意:默认的 SqlTrackingService 在两个版本的工作流上仍然运行良好,这只是现有持久化工作流上的自定义跟踪服务的问题。

自定义跟踪服务一直是通过 app.config 添加的,如下所示:

<Services>
       ...other services here...
      <add type="some.namespace.ActiveStateTrackingService, some.namespace.extensions" assembly="uk.gov.gsi.cma.extensions" />
</Services>

关于我需要更改哪些内容才能使其适用于现有工作流程的任何想法?

根据要求,这是自定义跟踪服务,尽管问题与主机“绑定”自定义跟踪服务有关,而不是跟踪服务本身 - 我知道这一点是因为在自定义跟踪服务不存在的情况下t 被触发,没有调用任何方法,包括构造函数。

  public class ActiveStateTrackingService : TrackingService
{
    protected override TrackingProfile GetProfile(Guid workflowInstanceId)
    {
        return GetDefaultProfile();
    }

    protected override TrackingProfile GetProfile(Type workflowType, Version profileVersionId)
    {
        return GetDefaultProfile();
    }

    protected override TrackingChannel GetTrackingChannel(TrackingParameters parameters)
    {
        return new ActiveStateTrackingChannel(parameters);
    }

    protected override bool TryGetProfile(Type workflowType, out TrackingProfile profile)
    {
        profile = GetDefaultProfile();
        return true;
    }

    protected override bool TryReloadProfile(Type workflowType, Guid workflowInstanceId, out TrackingProfile profile)
    {
        profile = null;
        return false;
    }

    private TrackingProfile GetDefaultProfile()
    {
        TrackingProfile profile = new TrackingProfile();
        profile.Version = new Version(1, 0);

        // Add tracking point for state activity executing
        ActivityTrackPoint statePoint = new ActivityTrackPoint();
        ActivityTrackingLocation location = new ActivityTrackingLocation(typeof(StateActivity), new ActivityExecutionStatus[] { ActivityExecutionStatus.Executing });
        statePoint.MatchingLocations.Add(location);
        profile.ActivityTrackPoints.Add(statePoint);

        return profile;
    }
}

public class ActiveStateTrackingChannel : TrackingChannel
{

    private TrackingParameters param;

    public ActiveStateTrackingChannel(TrackingParameters parameters)
    {
        param = parameters;
    }

    protected override void InstanceCompletedOrTerminated()
    {
        return;
    }

    protected override void Send(TrackingRecord record)
    {

        // get the tracking record and write out the name of the state.  
        var r = record as ActivityTrackingRecord;

        if (r != null)
            if (!string.IsNullOrEmpty(r.QualifiedName))
            {
                using (ICaseService caseService = new CaseService())
                    {
                        SomeServiceLayer.UpdateCurrentStateOutsideOfTheWorkflow(param.ContextGuid, r.ParentContextGuid, r.QualifiedName);
                        Console.WriteLine("*** Current State: {0} ***", r.QualifiedName);
                    }
            }                    
    }
}

【问题讨论】:

  • “程序集”标签用于低级编程,不适用于 .NET 程序集。
  • 如果没有看到更多您的自定义跟踪服务,很难判断。
  • @kay.herzam:我添加了跟踪服务代码,并说明了为什么我认为这与跟踪代码本身无关。

标签: serialization assemblies workflow-foundation strongname


【解决方案1】:

事实证明,最后一步很容易。问题是 WF 和 microsoft have outlined the answer here 中的一个错误。

您基本上必须使用一个属性来装饰您的自定义跟踪服务类,该属性允许您解析旧的跟踪服务引用,如下所示:

[System.Workflow.Runtime.Tracking.PreviousTrackingService("myNamespace.Workflow.StateMachineTrackingService, myNamespace.Workflow.StateMachineTracking, Version=1.2.0.1, Culture=neutral, PublicKeyToken=gr4b2191f58h9e0d")]
public class StateMachineTrackingService : TrackingService
       {
         //Body of your custom tracking service here
       }

瞧,我以前坚持的工作流程现在解决了新版本的跟踪服务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多