2011-11-06 17 views
6

我有一段時間運行一段時間的自定義跟蹤服務,現在有超過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); 
        } 
      }      
    } 
} 
+0

'assembly'標籤用於低級編程,不適用於.NET程序集。 – harold

+0

謝謝,糾正了錯字。 – Tr1stan

+0

很難說沒有看到更多的自定義跟蹤服務。 –

回答

0

事實證明,最後一步很簡單。這個問題是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 
     } 

低不料,我以前堅持的工作流程,現在解決的新版本追蹤服務。