gpt4 book ai didi

serialization - WF 自定义 SQL 跟踪服务停止为旧工作流工作?

转载 作者:行者123 更新时间:2023-12-04 16:12:36 26 4
gpt4 key购买 nike

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

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

我不得不混合使用自定义 SerializationBinder 来将 PublicKeyToken=null 转换为我的新 PublicKeyToken,并使用 AppDomain_AssemblyResolve 委托(delegate)来帮助将主机指向现在的强类型程序集 - 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>

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

根据要求,这是自定义跟踪服务,尽管问题与主机“绑定(bind)”自定义跟踪服务有关,而不是跟踪服务本身 - 我知道这一点是因为在未触发自定义跟踪服务的情况下,没有调用任何方法,包括构造函数。
  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);
}
}
}
}

最佳答案

事实证明,最后一步很容易。问题是 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
}

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

关于serialization - WF 自定义 SQL 跟踪服务停止为旧工作流工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8026291/

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