У меня есть специальная служба отслеживания, которая уже некоторое время работает с более чем 1500 текущими рабочими процессами, и сейчас я нахожусь в процессе создания версий рабочих процессов, чтобы можно было выпустить некоторые запросы на изменение.
К сожалению, система изначально не была развернута со строго типизированными сборками, поэтому я нахожусь в процессе разбора этого беспорядка.
Мне нужно использовать смесь настраиваемого SerializationBinder для преобразования PublicKeyToken = null в мой новый PublicKeyToken и делегата AppDomain_AssemblyResolve, чтобы помочь узлу установить теперь строго типизированные сборки - Ссылка здесь .
Мне также пришлось заменить содержимое связанных строк в таблице [Type], которая поставляется с SqlTrackingService по умолчанию для ссылки на новый PublicKeyToken, поэтому:
some.namespace.foobar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
заменяется на:
some.namespace.foobar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=123456789acb
Я, кажется, добился хорошего прогресса, однако, когда я перехожу в свой рабочий процесс State Machine, пользовательская служба отслеживания, добавленная в качестве службы, больше не запускает рабочие процессы версии 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>
Есть идеи о том, что еще мне нужно изменить, чтобы это работало для уже существующих рабочих процессов?
В соответствии с запросом, здесь есть пользовательская служба отслеживания, хотя проблема заключается в том, что хост «привязывает» пользовательскую службу отслеживания, а не сам сервис отслеживания - я знаю это, потому что в случае, когда настраиваемая служба отслеживания не t, ни один из методов, включая конструктор, не вызывается.
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);
}
}
}
}