【发布时间】: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