Warum ist die unendliche Schleife, Schutz ausgelöst wird, auf meine CRM-workflow?

Update

Ich soll Hinzugefügt haben von Anfang an - dies ist in Microsoft Dynamics CRM 2011


Ich weiß, CRM, aber ich bin an einem Verlust zu erklären-Verhalten auf meinem derzeitigen Einsatz.

Bitte Lesen Sie den Umriss von meinem Szenario, mir helfen zu verstehen, welche meiner Vermutungen /Absprachen falsch ist (und daher, was die Ursache dieses Fehlers). Es ist nicht im Einklang mit meinen Erwartungen.

Basis-Szenario

  • Anforderung verlangt, dass ein web-service aufgerufen wird alle X Minuten (es fügt ausstehende Elemente zu einer Datenbank-index)
  • Ich habe entschieden, einen workflow verwenden /custom entity-trigger-Modell (D. H. ich habe eine benutzerdefinierte Entität, die hat eine CREATE-plugin registriert. Das plugin führt meiner Logik. Eine begleitende workflow wird gestartet, wenn "beendet" - Zeit + [- timeout] abläuft. Auf Ablauf, es wird ein neuer trigger erstellt Datensatz, und der workflow endet).
  • Die plugin-Logik funktioniert Prima. Das workflow-Konzept funktioniert gut, bis zu einem Punkt, aber nach einem Zeitraum von Zeit, die workflow-Ständen mit einem Fehler:

    Dieser workflowauftrag wurde abgebrochen, da der workflow, mit dem Sie begonnen, enthalten eine unendliche Schleife. Korrigieren Sie die workflow-Logik und versuchen Sie es erneut. Für Informationen über workflow-Logik finden Sie in der Hilfe.

Also kurz und knapp - standard infinite loop detection. Ich verstehe das Konzept und warum es existiert.

Spezifische Bereitstellung

Erstens, ich denke, es ist ganz sicher für uns zu ignorieren, den Inhalt des plugin-Codes in diesem Szenario. Es funktioniert gut, es ist atomic und kaum berührt CRM (klar, es ist eine pre-event-plugin, das läuft über die remote-web-service, wartet auf eine Antwort und setzt dann das "erledigt am" Datum/Uhrzeit-Attribut für meine Trigger-Datensatz vor der übergabe an die Ziel-Entität wieder in der pipeline) . So lange, wie eine Trigger-Datensatz erstellt wird, wird dieser code ausgeführt wird, und tut, was es soll.

Dass abzüglich der Inhalt des plugins, es gibt vielleicht ein Problem, dass ich nicht zu schätzen wissen, dass das plugin registriert, die auf der pre-Schritt erstellen der entity...

So, dass die Blätter der workflow selbst. Es ist eine einfache. Es läuft folgendermassen:

  1. Auf die Schaffung eines neuen Auslöser-Entität...
  2. es hat einen Timeout Auslösen.new_completedon + 15 Minuten
  3. auf timeout, es wird ein neuer Trigger erstellt record (mit nicht "abgeschlossen" Wert - dieser wird durch das plugin erinnern)
  4. Das ist alles - keine explizite "end-workflow" (allerdings habe ich nur Hinzugefügt, ein jetzt und werden es testen...)

Mit diesem set-up, die ich manuell erstellen Sie einen neuen Trigger-Datensatz und der Prozess dreht sich schön in Aktion. Vorwärts 1h 58 min (basierend auf der Letzte Zyklus lief ich - daran erinnern, dass mein plugin-code kann in einer minute fertig ausgeführt), nach 7 erfolgreichen Ausführung Zyklen (z.B. neue workflow jobs geschaffen und abgeschlossen), die 8. man schlägt mit der oben genannten Fehlermeldung.

, Was ich schon weiß (korrigiert mich wo ich falsch Liege)

Rekursionstiefe ist standardmäßig auf 8 eingestellt. Wenn ein workflow /plugin nennt sich 8 mal, dann eine Endlosschleife erkannt wird.

Rekursionstiefe ist reset jede Stunde (oder 10 Minuten - siehe "Warnhinweise" im verlinkten blog?)

Rekursionstiefe Einstellungen per PowerShell oder SDK-code mit den Deployment Web-Service in einer on-premise-Bereitstellung nur (über das Set-Cmdlet CrmSetting)

, Was ich nicht hören will (bitte)

"Ändern Rekursionstiefe Einstellungen"

Kann ich nicht ändern die Bereitstellung Rekursionstiefe Einstellungen, da dies nicht eine option in einem online-Szenario - letztlich werde ich bereitstellen, um CRM Online zu.

"Erhöhen Sie den timeout-Zeitraum auf Ihren workflow"

Dies ist nicht eine option, entweder - die Neuindizierung muss alle 15 Minuten ausgeführt wird, im Idealfall früher.

Update

@Boone unten vorgeschlagen, dass die Rekursionstiefe timeout zurücksetzen nach 60 Minuten Inaktivität statt alle 60 Minuten. Darin liegt das erste Missverständnis.

Während der Diskussion mit @alex, ich schlug vor, dass es möglicherweise einige Persistenz der CorrelationId zwischen erstellen einer Entität über den workflow und die workflow ultimates wird gespawnt... Gut es ist. Die CorrelationId ist die gleiche in beiden das plugin und die workflow-und alle Datensätze, die Spule von diesem thread. Ich bin jetzt auf der Suche nach Möglichkeiten zur Entkopplung der CorrelationId (oder vielleicht die Erstellung der Datensätze) aus dem entity-und dem workflow.

  • Der workflow ruft sich selbst, das ist, warum Sie am Ende in einer Endlosschleife. Müssen Sie überdenken das ganze Konzept, die Erhöhung der Tiefe oder die timeout-Zeit würde nur verzögern, die Tötung des Prozesses durch unendliche Schleife.
  • Vielen Dank für Ihre Antwort Alex - du hast es einfach klingen, aber ich glaube nicht, dass es so ist. Auch wenn wir annehmen, dass der workflow ruft sich selbst auf (MSCRM denkt, es ist, ich denke, es ist es nicht - der workflow erstellt einen neuen Datensatz, anstatt ausdrücklich aufrufen, sich wieder wie ein Kind workflow. Ich würde erwarten, dass diese einen neuen "thread" - obwohl vielleicht die CorrelationId der plugin erbt von den Eltern und geht diese an die nachfolgende untergeordnete workflows), die Tiefe der Rekursion sollte zurückgesetzt werden, alle 10 oder 60 Minuten, ist es aber nicht.
  • Ich glaube MSCRM tatsächlich erkennt die indirekte Rekursion statt, da aufgrund genau CorrelationId s, das ist, warum die loop-Erkennung einsetzt. Ich bin fasziniert, wird ein bisschen Experimentieren und erhalten Sie zurück (dies könnte tatsächlich nützlich sein, auch für mich, wer weiß, ob/Wann ich ' ll erhalten eine ähnliche Anforderung? (: )
  • Ich denke, dass, wenn das der Fall ist, könnte es möglich sein, zu entkoppeln den Prozess, durch verschieben des plugin setzt, die "Vollendung der Zeit" zu sein, der asynchron-und der post-Betrieb vielleicht... ich werde auch versuchen, denke ich. Daran interessiert zu hören, Ihre unabhängige Ergebnisse zu 🙂
  • Verschieben des plugin-Ausführung Punkt-und/oder ändern zu async nicht nur werden verschiedene Fragen für mich zu adressieren (nicht im überwindbar um fair zu sein), aber wichtiger ist nicht einen Unterschied machen, die correlationid.
InformationsquelleAutor Greg Owens | 2012-05-15
Schreibe einen Kommentar