Тридион - Объекты системы событий не уничтожаются
Я создал 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
занятия довольно просты:
когда ты звонишь
Subscribe
TcmExtension
указанный вами объект добавляется во внутренний список подписоккогда ты позже позвонишь
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