01.12.2008, 13:27 | #21 |
Участник
|
Цитата:
А то что это будут блокировки между пользователями, думаю с точки зрения производительности было бы большой ошибкой. По крайней мере рефлектором я не увидел, что синхронные плагины ставяться в очередь, синхронные просто выполняются, один за другим. Артем, у вас есть ссылочка где это описано? |
|
01.12.2008, 16:15 | #22 |
Moderator
|
Есть ссылка только на SDK. Проблема быстродействия действительно есть, вот выдержка из этого же источника:
Registering a plug-in that performs lots of processing for a synchronous event can adversely affect the performance of the Microsoft Dynamics CRM system. Где-то в блогах разработчиков проходила информация, что в 4.0 для оптимизации ресурсов создается только 1 инстанция каждого плагина, а не по экземпляру на callout как в 3.0. Исходя из этого, сомнительно, чтобы синхронность была лишь на уровне пользователя.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
05.02.2009, 00:35 | #23 |
Участник
|
С полной уверенностью могу сказать - очередность выполнения плагинов возможна только в рамках обработки события. То есть если пользователь инициировал некоторое событие, то плагины, зарегистрированные на него возможно и объывленные как синхронные возможно будут выполнятся по очереди. В случае одновременной инициализации одним (или разными) пользователем нескольких одинаковых событий одной сущности, плагины будут выполнятьсяпараллельно. Уж не знаю, несколько ли раз при этом будут подключаться библиотеки с плагинами или они подключаются один раз и выполняются в разных потоках.
Уверенность моя исходит из следующего. Создал плагин который выполняет некоторое достаточно долгое действие. При начале работы плагин пишет в файл некий маркер (guid, чтобы отличать один экземпляр плагина от другого) и слово Start. По завершению работы тот же маркер и слово End. Повесил плагин на событие сущности. Создал workflow, которое инициирует событие сущности. Выделил две записи сущности и запустил workflow. Результат в файле был следующим: Start Start End End Вот такие вот пирожки с котятами... |
|
05.02.2009, 01:34 | #24 |
Участник
|
Да, и кстати... Мы почему-то стали путать и смешивать понятия синхронности плагинов и очередности выполнения. Синхронность всего лишь говорит о том что плагин выполниться при обработке события, а не когда то после. При этом синхронность (или асинхронность) никак не влияет ни на очередность выполнения плагинов в рамках одного события, ни на очередность вообще. Кстати, на сколько я понимаю, в отличии от колаутов, для плагинов вообще нельзя задать очередность (в рамках обработки одного события). В какой последовательности они будут выполняться (и в последовательности ли вообще, а может параллельно) - одному богу известно...
|
|
19.02.2009, 23:24 | #25 |
Участник
|
Ну раз уж так далеко зашло :)
SDK нигде не описан способ очередности обработки нескольких вызовов веб-сервисов, тем не менее 99,9% процентов, что они выполняются паралельно, это из личного опыта, связанного с нагрузочным тестированием. Все из информации, что доступно из СДК :
http://msdn.microsoft.com/en-us/library/cc151078.aspx т.е. сущность "лочится", после выполнения пре-плагинов и "разлачивается" перед выпоолнением пост-плагинови и коллизия о которой говорит ZooY вполне возможна. Если вы не доверяете майкрософту в плане разрешения таких коллизий, достаточно просто реализовать свой механизм, например при помощи семафоров для сущности "Нумератор". Для этого добавить поле, например new_islocked и перед какими-либо операциями устанавливать это поле в 1, при этом повесив на "Нумератор" пре-плагин, который отрубает попытку обновления, если значение семафора 1. После выполнения плагин должен вернуть значение семафора в 0. Цитата:
Кстати, на сколько я понимаю, в отличии от колаутов, для плагинов вообще нельзя задать очередность (в рамках обработки одного события). В какой последовательности они будут выполняться (и в последовательности ли вообще, а может параллельно) - одному богу известно...
|
|
|
|