2011-11-06 32 views
6

Tôi có một dịch vụ theo dõi tùy chỉnh đã hoạt động trong một thời gian với hơn 1500 luồng công việc trực tiếp đang tích lũy, tôi hiện đang trong quá trình phiên bản luồng công việc để tôi có thể phát hành một số yêu cầu thay đổi.Dịch vụ theo dõi SQL tùy chỉnh WF Ngưng làm việc cho các luồng công việc cũ?

Thật không may là hệ thống ban đầu không được triển khai với các hội đồng được đánh máy mạnh, vì vậy tôi đang trong quá trình phân loại mớ hỗn độn này.

Tôi phải sử dụng một hỗn hợp của một SerializationBinder tùy chỉnh để dịch PublicKeyToken = null sang PublicKeyToken mới của tôi và một đại biểu AppDomain_AssemblyResolve để giúp trỏ máy chủ đến các cụm đã được gõ mạnh mẽ - Referenced here.

Tôi cũng đã phải thay thế nội dung của các hàng có liên quan trong phạm vi [Loại] bảng mà đi kèm với các SqlTrackingService mặc định để tham khảo các PublicKeyToken mới, vì vậy:

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

được thay thế bằng:

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

Tôi dường như đang tiến triển tốt, tuy nhiên khi tôi chuyển đổi quy trình làm việc của Máy nhà nước, Dịch vụ theo dõi tùy chỉnh mà tôi đã thêm làm dịch vụ không còn kích hoạt cho luồng công việc phiên bản 1.0.0.0 nữa. phiên bản 2.0.0.0 quy trình công việc.

Lưu ý: SqlTrackingService mặc định vẫn chạy tốt trên cả hai phiên bản của luồng công việc, đây chỉ là vấn đề với dịch vụ theo dõi tùy chỉnh trên luồng công việc hiện có.

Dịch vụ theo dõi tùy chỉnh luôn được bổ sung thông qua các app.config như thế này:

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

Bất kỳ ý tưởng về những gì khác tôi cần phải thay đổi để làm việc này cho các quy trình công việc đã tồn tại? Theo yêu cầu, đây là dịch vụ theo dõi tùy chỉnh, mặc dù vấn đề là phải làm với máy chủ "ràng buộc" dịch vụ theo dõi tùy chỉnh, chứ không phải bản thân dịch vụ theo dõi - tôi biết điều này vì trong trường hợp dịch vụ theo dõi tùy chỉnh là không không được kích hoạt, không có phương thức nào, bao gồm cả hàm tạo được gọi.

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

Thẻ 'assembly' dành cho lập trình cấp thấp, không dành cho các hội đồng .NET. – harold

+0

Cảm ơn, đã sửa lỗi đánh máy. – Tr1stan

+0

Khó mà nói mà không thấy nhiều dịch vụ theo dõi tùy chỉnh của bạn. –

Trả lời

0

Hóa ra bước cuối cùng là dễ dàng. Vấn đề là một lỗi trong WF và microsoft have outlined the answer here.

Bạn về cơ bản có để trang trí lớp dịch vụ theo dõi tùy chỉnh của bạn với một thuộc tính cho phép bạn để giải quyết tài liệu tham khảo phục vụ theo dõi cũ, như vậy:

[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 
     } 

Thấp và behold, tôi công việc vẫn kiên trì trước đây tại giải quyết các phiên bản mới của Dịch vụ theo dõi.