Тридион - Объекты системы событий не уничтожаются

Я создал TcmExtension названный WorkflowEventSystem с обработчиком событий, подписанным на FinishProcess событие. Цель этого события - запланировать публикацию всех зависимостей (т. Е. Страниц) соответствующей темы рабочего процесса.

Проблема, с которой я сталкиваюсь, заключается в том, что, хотя событие срабатывает в нужное время (рабочий процесс завершен), и все элементы, которые должны быть запланированы для публикации, PublishScheduler объект, созданный событием, кажется, никогда не выходит из области видимости, и как таковой объект WorkflowEventSystem также не выходит.

Есть ли что-то, чего мне не хватает в том, как работает система событий, которая заставила бы эти объекты жить вечно? Я включил то, что считаю соответствующим кодом ниже (некоторые части суммированы). Спасибо за любую помощь.

Вот большая часть фактического TcmExtension:

public class WorkflowEventSystem : TcmExtension
{
    public WorkflowEventSystem()
    {
        this.Subscribe();
    }

    public void Subscribe()
    {
        EventSystem.Subscribe<ProcessInstance, FinishProcessEventArgs>(ScheduleForPublish, EventPhases.All);
    }
}

ScheduleForPublish создает PublishScheduler объект (класс, который я создал):

private void ScheduleForPublish(ProcessInstance process, FinishProcessEventArgs e, EventPhases phase)
{
    if(phase == EventPhases.TransactionCommitted)
    {
        PublishScheduler publishScheduler = new PublishScheduler(process);
        publishScheduler.ScheduleForPublish(process);
        publishScheduler = null;  // worth a try
    }
}

ScheduleForPublish Метод выглядит примерно так:

public void ScheduleForPublish(ProcessInstance process)
{
    using(Session session = new Session("ImpersonationUser"))
    {
        var publishInstruction = new PublishInstruction(session);
        // Set up some publish Instructions

       var publicationTargets = new List<PublicationTarget>();
       // Add a PublicationTarget here by tcm id

       IList<VersionedItem> itemsToPublish = new List<VersionedItem>();
       // Add the items we want to publish by calling GetUsingItems(filter)
       // on the workflow process' subject

       //Publish the items
       PublishEngine.Publish(itemsToPublish.Cast<IdentifiableObject>(), publishInstruction, publishTargets);
    }    
}

1 ответ

Решение

Управление жизненным циклом для TcmExtension занятия довольно просты:

  1. когда ты звонишь Subscribe TcmExtension указанный вами объект добавляется во внутренний список подписок

  2. когда ты позже позвонишь Unsubscribe тот же самый TcmExtension объект удален из списка подписок

Так как ты никогда не звонишь Unsubscribe ваш WorkflowEventSystem никогда не удаляется и, следовательно, никогда не будет собирать мусор.NET. И так как ваш WorkflowEventSystem содержит ссылку на PublishScheduler Например, он создал, что никто никогда не будет очищен.

Правильный шаблон для кастома TcmExtension является:

public class WorkflowEventSystem : TcmExtension, IDisposable
{
    EventSubscription _subscription;

    public WorkflowEventSystem()
    {
        this.Subscribe();
    }

    public void Subscribe()
    {
         _subscription = EventSystem.Subscribe<ProcessInstance, 
             FinishProcessEventArgs>(ScheduleForPublish, EventPhases.All);
    }

    public void Dispose()
    {
        _subscription.Unsubscribe();
    }
}

Нуно также привел более длинный пример (работа с несколькими подписчиками) в этой статье: http://nunolinhares.blogspot.nl/2012/07/validating-content-on-save-part-1-of.html

Другие вопросы по тегам