Несколько участников отслеживания не работают, есть забавные побочные эффекты? - PullRequest
0 голосов
/ 08 сентября 2011

Мы пытаемся использовать WF с несколькими участниками отслеживания, которые по сути слушают разные запросы - один для состояний активности, один для пользовательских записей отслеживания, которые являются подклассом CustomTrackingRecord.

Проблема в том, что мы можем использоватьоба TrackingParticipants по отдельности, но не вместе - мы никогда не получим наш подкласс от CustomTrackingRecord, но A CustomTrackingRecord.

Если я помещаю bopth запросы в один TrackingParticipant, а затем обрабатываю все в одном, оба работают отлично (что указывает на ошибкукуда мы их бросаем).

Код для комбинированного кода:

public WorkflowServiceTrackingParticipant ()
{
    this.TrackingProfile = new TrackingProfile()
    {
        ActivityDefinitionId = "*",
        ImplementationVisibility = ImplementationVisibility.All,
        Name = "WorkflowServiceTrackingProfile",
        Queries = {
            new CustomTrackingQuery() { Name = "*", ActivityName = "*" },
            new ActivityStateQuery() { 
                States = {
                    ActivityStates.Canceled,
                    ActivityStates.Closed, 
                    ActivityStates.Executing, 
                    ActivityStates.Faulted
                } 
            },
        }
    };
}

При использовании двух участников TrackingPartient у нас есть два TrackingProfile (с разными именами), каждый из которых имеет один иззапрашивает.

в методе track, при использовании обоих отдельных строк:

    protected override void Track(TrackingRecord record, TimeSpan timeout)
    {
        Console.WriteLine("*** ActivityTracking: " + record.GetType());
        if (record is ActivityBasedTrackingRecord)
        {
            System.Diagnostics.Debugger.Break();
        }

никогда не приводит к попаданию отладчика, когда используется только тот, который отслеживает наш подкласс CustomTrackingRecord (ActivityBasedTrackingRecord)затемэто работает.

Кто-нибудь еще знает об этом?На данный момент мы объединили оба участника TrackingParticipant в одно, но это имеет неприятный побочный эффект, заключающийся в том, что мы не можем динамически расширять возможности ведения журнала, что нам бы очень хотелось.Это известная проблема с WWF?

Используемая версия: 4.0 Sp1 Feature Update 1.

Ответы [ 2 ]

2 голосов
/ 14 сентября 2011

Полагаю, я столкнулся с точно такой же проблемой.Эта проблема возникает из-за ограничений механизма расширения.Может быть только один экземпляр для каждого типа расширения на экземпляр рабочего процесса (согласно документации Microsoft).Интересно, что можно добавить несколько экземпляров одного типа к расширениям одного рабочего процесса, что - в случае производных TrackingParticipant - вызывает странное поведение, потому что только один из их профилей отслеживания используется для всех участников соответствующего типа, но все их переопределенияметода Track вызываются.Существует (imho) уродливый обходной путь: извлеките новый класс участника из TrackingParticipant для каждой задачи (задача 1, задача 2, ведение журнала ...)

С уважением, Джейкоб

0 голосов
/ 02 августа 2012

Я думаю, что эта проблема не вызвана механизмом расширения, поскольку DerivedParticipant 1 и DerivedParticipant 2 не одного типа (внутренние компоненты WF просто используют полиморфизм в базовом классе).

Я работал по той же проблеме, мой Derived1 отслеживал записи, которые не были описаны в его профиле.

Derived1.TrackingProfile.Name было "Foo" и Derived2.TrackingProfile.Name было null

Я изменил имя с null на "Bar", и оно заработало, как и ожидалось.1022 * Вот внутренний справочный код WF, описывающий, как выбран профиль

// System.Activities.Tracking.RuntimeTrackingProfile.RuntimeTrackingProfileCache
public RuntimeTrackingProfile GetRuntimeTrackingProfile(TrackingProfile profile, Activity rootElement)
{
    RuntimeTrackingProfile runtimeTrackingProfile = null;
    HybridCollection<RuntimeTrackingProfile> hybridCollection = null;
    lock (this.cache)
    {
        if (!this.cache.TryGetValue(rootElement, out hybridCollection))
        {
            runtimeTrackingProfile = new RuntimeTrackingProfile(profile, rootElement);
            hybridCollection = new HybridCollection<RuntimeTrackingProfile>();
            hybridCollection.Add(runtimeTrackingProfile);
            this.cache.Add(rootElement, hybridCollection);
        }
        else
        {
            ReadOnlyCollection<RuntimeTrackingProfile> readOnlyCollection = hybridCollection.AsReadOnly();
            foreach (RuntimeTrackingProfile current in readOnlyCollection)
            {
                if (string.CompareOrdinal(profile.Name, current.associatedProfile.Name) == 0 && string.CompareOrdinal(profile.ActivityDefinitionId, current.associatedProfile.ActivityDefinitionId) == 0)
                {
                    runtimeTrackingProfile = current;
                    break;
                }
            }
            if (runtimeTrackingProfile == null)
            {
                runtimeTrackingProfile = new RuntimeTrackingProfile(profile, rootElement);
                hybridCollection.Add(runtimeTrackingProfile);
            }
        }
    }
    return runtimeTrackingProfile;
}
...