我有一段時間運行一段時間的自定義跟蹤服務,現在有超過1500個實時工作流程正在打勾,我現在正在對工作流進行版本控制,以便我可以發佈一些更改請求。WF自定義SQL跟蹤服務已停止爲舊的工作流程工作?
不幸的是,系統最初並沒有使用強類型的程序集進行部署,所以我正在對這個問題進行排序。
我不得不使用混合自定義SerializationBinder將PublicKeyToken = null轉換爲新的PublicKeyToken,並使用AppDomain_AssemblyResolve委託幫助將主機指向現在強類型的程序集 - Referenced here。
我也有到[類型]表中自帶的默認SqlTrackingService引用新的公鑰內更換相關行的內容,所以:
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>
上還有什麼我需要改變,以得到這個工作對現有工作流程的任何想法?
根據要求,這裏是自定義跟蹤服務,雖然問題是與主機「綁定」自定義跟蹤服務,而不是跟蹤服務本身 - 我知道這是因爲在自定義跟蹤服務不是沒有被解僱,沒有任何方法,包括構造函數被調用。
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);
}
}
}
}
'assembly'標籤用於低級編程,不適用於.NET程序集。 – harold
謝謝,糾正了錯字。 – Tr1stan
很難說沒有看到更多的自定義跟蹤服務。 –