2015-09-28 2 views
1

Проблема: при использовании Sitecore.Data.Serialization.Manager для десериализации сериализованных элементов в Sitecore 8 мои кэши очищаются. Это не должно быть, так как я называю его с опцией DisableEvents = true так:Deserialization элемента Sitecore медленный/запуск кеширования

var options = new Sitecore.Data.Serialization.LoadOptions(masterDb); 
options.ForceUpdate = true; 
options.DisableEvents = true; 

using (new Sitecore.SecurityModel.SecurityDisabler()) 
{ 
    Sitecore.Data.Serialization.Manager.LoadItem(itemPath, options); 
} 

Тем не менее, хотя, кэш очищается - с поддержкой отладки, я получаю это:

36956 19: 32:31 INFO Загрузка объекта с пути /master/sitecore/templates/SomeFolder/SomeItem.item.

36956 19:32:34 WARN Все тайники были очищены. Это может значительно снизить производительность.

36956 19:32:34 DEBUG Все кеши были очищены. Стек след: в System.Environment.GetStackTrace (Exception е, Boolean needFileInfo)
в System.Environment.get_StackTrace() в Sitecore.Caching.CacheManager.ClearAllCaches() в Sitecore.Data.Serialization.Manager. < .cctor> b__1 (SerializationFinishedEvent событие) в Sitecore.Eventing.EventProvider.RaiseEvent (событие объекта, Тип типСобытия, EventContext контекст) на Sitecore.Data.Serialization.Manager.DeserializationFinished (String DATABASENAME)

ответ

0

EDIT/UPDATE

Ответ Марека заставил меня осознать, что я говорил что-то неправильно. Я оставлю свой первоначальный предложенный ответ неповрежденным, чтобы не вызвать путаницу. Но подведем итог, назвав метод LoadItemс опцией DisableEvents работает как ожидалось. Только это - компенсировать отсутствие соответствующих событий при запуске - триггер Manager.DeserializationFinished(...), который, в свою очередь (по крайней мере, для моей установки по умолчанию Sitecore 8), вызывает CacheManager.ClearAllCaches().

Неверный вывод был вызван тем фактом, что метод CacheManager.ClearAllCaches() вызывается с использованием собственного * EventProvider Sitecore *, поэтому, как указывает Марек, это неудачное совпадение/столкновение имен.

Фактически, запуск CacheManager.ClearAllCaches() - это то, чего я хотел избежать. Поэтому я думаю, что каким-то образом этот «обходной путь» ускоряет мою десериализацию (поскольку он не очищает все кеши для каждого выполнения).


ОРИГИНАЛЬНЫЙ ПОСТ

Итак, я отправился в город и в конце концов обнаружил это, разборке Sitecore.Data.Serialization.Manager.LoadItem(...) метод (примечание: это Sitecore основной материал (с моими комментариями)):

public static Item LoadItem(string path, LoadOptions options) 
    { 
     Assert.ArgumentNotNullOrEmpty(path, "path"); 
     Assert.ArgumentNotNull((object) options, "options"); 
     if (!options.DisableEvents) <-------------------------- HERE IS THE BUG 
     return Manager.DoLoadItem(path, options); 
     Item obj; 
     using (new EventDisabler()) 
     obj = Manager.DoLoadItem(path, options); 
     //This next line fires the events - but to get here, DisableEvents must be true. 
     Manager.DeserializationFinished(Manager.GetTargetDatabase(path, options)); 
     return obj; 
    } 

Это похоже на ошибку. Msgstr "Если не options.DisableEvents return". Там слишком много «не»?

Обходной просто установить

options.DisableEvents = false; 

Установки в false отключает событие прослушивания в SerializationFinishedEvent, в этом случае обработчик, который вызывает Sitecore.Caching.CacheManager.ClearAllCaches(), как намекает стеки-след. Хотя кажется, что это должно быть наоборот.

+0

Извините @ FrederikStruck-Schøning, но вы не правы. См. Мой ответ ниже. –

+0

Я понимаю, вы правы. Я ответил вам в вашем «ответе». –

+0

@MarekMusielak Я сделал обновление в начале своего собственного «ответа», чтобы отразить, что вы помогли мне понять :) –

2

Frederik, в своем ответе вы вставленные разобранном код метода LoadItem и вы добавили комментарии в строках, где вы думали, что там была ошибка:

// QUOTE FROM THE AUTHOR OF THE QUESTION, Frederik Struck-Schøning 
public static Item LoadItem(string path, LoadOptions options) 
{ 
    Assert.ArgumentNotNullOrEmpty(path, "path"); 
    Assert.ArgumentNotNull((object) options, "options"); 
    if (!options.DisableEvents) <-------------------------- HERE IS THE BUG 
     return Manager.DoLoadItem(path, options); 
    Item obj; 
    using (new EventDisabler()) 
     obj = Manager.DoLoadItem(path, options); 
    //This next line fires the events - but to get here, DisableEvents must be true. 
    Manager.DeserializationFinished(Manager.GetTargetDatabase(path, options)); 
    return obj; 
} 

А потом объяснил, почему вы думаете, что этот код неверен.

Фактически, это точно противоположный путь к тому, что вы написали.

Когда вы десериализация вещи без DisableEvents набора для ложных, все кэша обновляются автоматически item:saved и другими событиями.

Если вы сообщите Sitecore, чтобы отключить все события, кеши никогда не будут обновлены. Вот почему Sitecore выполняет ClearAllCaches после того, как элементы десериализованы. К сожалению, в трассировке стека вы видите имя «событие». Все события Sitecore, такие как item:added, item:created, item:saved и т. Д. Не выполняются. Выполняется только 1 событие, чтобы уведомить ваш текущий экземпляр и удаленные экземпляры Sitecore, и это событие SerializationFinishedEvent (в его локальной и удаленной версии).

Так что это неSitecore ошибка, это вопрос скорее именования. Это может ввести в заблуждение, но все работает так, как ожидалось. Вместо того, чтобы выполнять последовательность событий каждый раз, когда элемент сохраняется, обновляется, переименовывается и т. Д., После завершения метода есть только одно уведомление.

+0

Привет Марек, спасибо за ваш ответ. Я понимаю, вы правы: если 'DisableEvents = true', действительно,' EventDisabler' используется при загрузке элемента. Я был слишком сосредоточен на вызове DeserializationFinished, который, в свою очередь, вызывает метод CacheManager.ClearAllCaches(). Я использую метод LoadItem много раз в течение короткого периода времени, поэтому вызов ClearAllCaches() становится дорогим. Можете ли вы придумать способ отключить события * и * не вызывать 'ClearAllCaches()'? Можно ли каким-то образом удалить этот обработчик событий? –

Смежные вопросы