WF Custom SQL Tracking Service перестала работать для старых рабочих процессов? - PullRequest
6 голосов
/ 06 ноября 2011

У меня есть специальная служба отслеживания, которая уже некоторое время работает с более чем 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);
                    }
            }                    
    }
}

1 Ответ

0 голосов
/ 04 января 2012

Оказывается, последний шаг - легкий. Проблема заключается в ошибке в WF и Microsoft обрисовал здесь ответ .

В основном вы должны украсить свой пользовательский класс сервиса отслеживания атрибутом, который позволяет вам разрешать старые ссылки на сервисы отслеживания, например:

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

Вот и все, мои ранее сохраненные рабочие процессы теперь разрешают новую версию службы отслеживания.

...