Почему в моем рабочем процессе CRM срабатывает защита от бесконечного цикла?
============================================================================

Update

Я должен был добавить с самого начала - это в Microsoft Dynamics CRM**2011**

Я хорошо знаю CRM, но затрудняюсь объяснить поведение моего текущего развертывания.

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

Basic Scenario

Requirement demands that a web service is called every X minutes (it adds pending items to a database index)
I've opted to use a workflow / custom entity trigger model (i.e. I have a custom entity which has a CREATE plugin registered. The plugin executes my logic. An accompanying workflow is started when **"completed" time + [timeout period]** expires. On expiry, it creates a new trigger record and the workflow ends). 
The plugin logic works just fine. The workflow concept works fine to a point, but after a period of time the workflow stalls with a failure:
This workflow job was canceled because the workflow that started it included an infinite loop. Correct the workflow logic and try again. For information about workflow logic, see Help.

 
  Итак, в двух словах - стандартное обнаружение бесконечного цикла. Я понимаю концепцию и почему она существует.

Specific deployment

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

Не обращая внимания на содержание плагина, может возникнуть проблема, которую я не ценю, зарегистрировав плагин на этапе предварительного создания объекта ...

Так что это оставляет рабочий процесс сам по себе. Это просто. Это работает так:

On creation of a new Trigger entity...
it has a Timeout of Trigger.new\_completedon + 15 minutes
on timeout, it creates a new Trigger record (with no "completed on" value - this is set by the plugin remember)
That's all - no explicit "end workflow" (though I've just added one now and will set it testing...)

С помощью этой настройки я вручную создаю новую запись триггера, и процесс красиво превращается в действие. Бросьте вперед 1 ч 58 мин (основываясь на последнем цикле, который я запустил, помня, что мой код плагина может занять минуту, чтобы завершить работу), после 7 циклов успешного выполнения (т. Е. Создание и выполнение новых заданий рабочего процесса), восьмой сбой с вышеупомянутая ошибка.

What I already know (correct me where I'm wrong)

[Глубина рекурсии по умолчанию установлена на 8](https://msdn.microsoft.com/en-us/library/microsoft.xrm.sdk.iexecutioncontext.depth.aspx), Если рабочий процесс / плагин вызывает себя 8 раз, то обнаруживается бесконечный цикл.

[Глубина рекурсии сбрасывается каждый час](https://msdn.microsoft.com/en-us/library/microsoft.xrm.sdk.iexecutioncontext.depth.aspx) ([или 10 минут - см. «Предупреждения»; в связанном блоге](https://gonzaloruizcrm.blogspot.co.uk/2011/05/quite-often-we-have-business-process.html)?)

[Настройки глубины рекурсии могут быть установлены через PowerShell](http://blog.dorrekens.com/index.php/list/137-mscrm-infinite-loop-for-plugins) или код SDK, используя[Веб-служба развертывания](https://msdn.microsoft.com/en-us/library/gg328063.aspx) in an on-premise deployment only ([через командлет Set-CrmSetting](https://msdn.microsoft.com/en-us/library/gg328563.aspx))

What I don't want to hear (please)

**"Change recursion depth settings"**

Я не могу изменить настройки глубины рекурсии развертывания, поскольку это не вариант в онлайн-сценарии - в конечном итоге я буду развертывать и в CRM Online.

& Quot;**Increase the timeout period on your workflow**& Quot;

Это также не вариант - переиндексация должна происходить каждые 15 минут, в идеале раньше.

Update

@Boone предложил ниже, что тайм-аут глубины рекурсии сбрасывается через 60 минут**inactivity** а не каждые 60 минут. В этом и заключается первое недоразумение.

Обсуждая с @alex, я предположил, что CorrelationId может сохраняться между созданием сущности через рабочий процесс и рабочим процессом, который порождает ультимативы ... Ну, есть. CorrelationId одинаков как в плагине, так и в рабочем процессе, а также во всех записях, которые спулируют из этого потока. Сейчас я ищу способы отделить CorrelationId (или, возможно, создание записей) от сущности и рабочего процесса.

 у вас не должно быть активности в течение часа. Он не сбрасывается всего за 1 час от оригинала. Таким образом, поскольку у вас есть активность каждые 15 минут, у нее никогда не будет возможности сбросить. Я нигде не знаю, что сказано в камне ... но по своему опыту.

В CRM 4 можно было создать службу CRM (Google[создание службы CRM в дочернем конвейере](https://social.microsoft.com/Forums/en/crmdevelopment/thread/03f7503b-cbbd-4339-bd14-c051b9afd006)) и сбросить идентификатор корреляции (используя CorrelationToken.NewToken ()). Я не вижу ничего такого простого в SDK 2011 года. Не знаю, сработал ли этот трюк в онлайн-среде. Совместим ли 2011 онлайн с плагинами CRM 4?

Одна вещь, которую вы могли бы попробовать, это использовать IExecutionContext.CorrelationId для очистки таблицы асинхронных операций (системное задание). Но в соответствии с метаданными, атрибут, который я считаю полезным (CorrelationId, CorrelationUpdatedTime, Depth), НЕ подходит для обновления.Maybe Вы могли бы удалить строки? Даже это не может помочь.



Я бы предложил другой подход: развернуть простое приложение вместе с CRM и позволитьit вызовите веб-службу, которая, в свою очередь, может использовать конечные точки XRM для изменения записей.

**UPDATE**

Или, вы можете попробовать что-то вроде этого при инициализации вашей службы crm в плагине (откопал его из одного из моих плагинов), оставив ваш рабочий процесс без изменений:

Я признаю, что не очень много помню об этом (код датируется около 2 лет назад), но это может помочь.