6

Mam niestandardową usługę śledzenia, która działa już od jakiegoś czasu i obejmuje ponad 1500 przepływów pracy na żywo, teraz jestem w trakcie wersjonowania przepływów pracy, dzięki czemu mogę zwolnić niektóre żądania zmian.Niestandardowa usługa śledzenia języka SQL WF przestała działać w przypadku starych przepływów pracy?

Niestety system nie został początkowo wdrożony z mocno wpisanymi złożeniami, więc jestem w trakcie sortowania tego bałaganu.

mam użyć mieszanki niestandardowych SerializationBinder przetłumaczyć TokenKluczaPublicznego = null do mojego nowego TokenKluczaPublicznego oraz delegata AppDomain_AssemblyResolve pomóc wskazać hosta do teraz zdecydowanie wpisywanych zespołów - Referenced here.

Ja również musiałem zastąpić zawartość powiązanych wierszy w tabeli [typ], który pochodzi z domyślnym SqlTrackingService odwołać nowego TokenKluczaPublicznego, więc:

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

otrzymuje brzmienie:

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

Wyglądało na to, że robię duże postępy, jednak kiedy przełączam przepływ pracy w komputerze stanu, niestandardowa usługa śledzenia, którą dodałem jako usługa, nie jest już uruchamiana dla przepływów pracy w wersji 1.0.0.0, ale działa dla nowo utworzonych. Przepływy pracy w wersji 2.0.0.0.

Uwaga: Domyślna usługa SqlTrackingService nadal działa poprawnie w obu wersjach przepływu pracy, jest to tylko problem z niestandardową usługą śledzenia w istniejących, utrwalonych przepływach pracy.

Custom Tracking obsługa zawsze była dodana przez app.config tak:

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

Wszelkie pomysły na to, co jeszcze trzeba zmienić, aby uzyskać ten pracuje dla już istniejących organizacji pracy?

Zgodnie z prośbą, tutaj jest niestandardowa usługa śledzenia, chociaż problem polega na tym, że host "wiąże" niestandardową usługę śledzenia, a nie samą usługę śledzenia - wiem o tym, ponieważ w przypadku, w którym niestandardowa usługa śledzenia nie istnieje 't zwolniony, żadna z metod, w tym konstruktor nie zostanie wywołana.

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

Znacznik "assembly" służy do programowania niskiego poziomu, a nie do zestawów .NET. – harold

+0

Dzięki, poprawiono literówkę. – Tr1stan

+0

Trudno powiedzieć, nie widząc więcej niestandardowej usługi śledzenia. –

Odpowiedz

0

Okazuje się, że ostatni krok jest łatwy. Problemem jest błąd w WF i microsoft have outlined the answer here.

Zasadniczo trzeba ozdobić swoją niestandardową klasę usług śledzenia z atrybutem, który pozwala rozwiązać stare referencje usługi śledzenia, jak w przykładzie:

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

niskie i oto moje poprzednio trwają przepływy teraz rozwiązać nową wersję usługi śledzenia.

Powiązane problemy