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);
}
}
}
}
Znacznik "assembly" służy do programowania niskiego poziomu, a nie do zestawów .NET. – harold
Dzięki, poprawiono literówkę. – Tr1stan
Trudno powiedzieć, nie widząc więcej niestandardowej usługi śledzenia. –