Warum wird der Endlosschleifenschutz in meinem CRM-Workflow ausgelöst?

8

Aktualisieren

Ich hätte von Anfang an hinzufügen sollen - das ist in Microsoft Dynamics CRM 2011

Ich kenne CRM gut, aber ich weiß nicht, wie ich mein aktuelles Deployment erklären soll.

Bitte lesen Sie den Überblick über mein Szenario, um mir zu verdeutlichen, welche meiner Annahmen falsch ist (und daher, was diesen Fehler verursacht). Es entspricht nicht meinen Erwartungen.

Grundszenario

  • Die Anforderung erfordert, dass ein Web-Service alle X Minuten aufgerufen wird (er fügt ausstehende Elemente einem Datenbankindex hinzu)
  • Ich habe mich entschieden, ein Workflow- / benutzerdefiniertes Entity-Triggermodell zu verwenden (dh ich habe eine benutzerdefinierte Entität, bei der ein CREATE-Plug-in registriert ist. Das Plug-in führt meine Logik aus. Ein begleitender Workflow wird gestartet, wenn "completed" time + [timeout period] läuft ab. Nach Ablauf erstellt es einen neuen Trigger-Record und der Workflow endet.
  • Die Plugin-Logik funktioniert gut. Das Workflow-Konzept funktioniert bis zu einem gewissen Grad, aber nach einer gewissen Zeit bleibt der Workflow mit einem Fehler stehen:
      

    Dieser Workflow-Job wurde abgebrochen, weil der Workflow, der ihn gestartet hat, eine Endlosschleife enthielt. Korrigieren Sie die Workflow-Logik und versuchen Sie es erneut. Informationen zur Workflow-Logik finden Sie in der Hilfe.

  •   
  Auf den Punkt gebracht - Standard Endlosschleife Erkennung. Ich verstehe das Konzept und warum es existiert.

Spezifische Implementierung

Erstens denke ich, dass es für uns ziemlich sicher ist, den Inhalt des Plugin-Codes in diesem Szenario zu ignorieren. Es funktioniert gut, es ist atomar und berührt kaum CRM (um klar zu sein, es ist ein Pre-Event-Plugin, das den Remote-Web-Service läuft, erwartet eine Antwort und setzt dann das "abgeschlossen am" Datum / Zeit-Attribut auf meinem Trigger-Datensatz vor dem Passieren die Zieleinheit zurück in die Pipeline). Solange ein Trigger-Datensatz erstellt wird, wird dieser Code ausgeführt und tut was er sollte.

Wenn ich den Inhalt des Plugins berabeite, könnte es ein Problem geben, das ich nicht zu schätzen weiß, wenn das Plugin im Pre-Create-Schritt der Entity registriert ist ...

Damit bleibt der Workflow selbst bestehen. Es ist einfach. Es läuft so:

  1. Beim Erstellen einer neuen Trigger-Entity ...
  2. es hat eine Timeout von Trigger.new_completedon + 15 Minuten
  3. bei Timeout erstellt es einen neuen Trigger-Datensatz (ohne "abgeschlossen am" Wert - dies wird vom Plugin festgelegt)
  4. Das ist alles - kein expliziter "End-Workflow" (obwohl ich gerade einen hinzugefügt habe und ihn testen werde ...)

Mit dieser Konfiguration erstelle ich manuell einen neuen Trigger-Datensatz und der Prozess wird gut umgesetzt. Roll forwards 1h 58 mins (basierend auf dem letzten Zyklus, den ich ausgeführt habe - daran erinnernd, dass mein Plugin Code eine Minute dauern kann), nach 7 erfolgreichen Ausführungszyklen (dh neue Workflow Jobs werden erstellt und vervollständigt), scheitert der 8 vorgenannter Fehler.

Was ich bereits weiß (korrigiere mich wo ich falsch liege)

Die Rekursionstiefe ist standardmäßig auf 8 . Wenn sich ein Workflow / Plugin achtmal selbst aufruft, wird eine Endlosschleife erkannt.

Die Rekursionstiefe wird jede Stunde zurückgesetzt (< a href="http://gonzaloruizcrm.blogspot.co.uk/2011/05/quite-oft-we-have-business-process.html"> oder 10 Minuten - siehe "Warnungen" im verknüpften Blog ?)

Einstellungen für die Rekursionstiefe können über die PowerShell oder eingestellt werden SDK-Code mit dem Bereitstellungswebdienst nur in einer lokalen Bereitstellung ( über das Set-CrmSetting Cmdlet )

Was ich nicht hören möchte (bitte)

"Ändern der Einstellungen für die Rekursionstiefe"

Ich kann die Deployment-Rekursionstiefe-Einstellungen nicht ändern, da dies in einem Online-Szenario keine Option ist - letztendlich werde ich auch in CRM Online bereitstellen.

" Erhöhen Sie die Zeitüberschreitung für Ihren Workflow "

Dies ist auch keine Option - der Reindex muss alle 15 Minuten erfolgen, am besten früher.

Aktualisieren

@Boone schlug unten vor, dass das Zeitlimit für die Rekursionstiefe nach 60 Minuten Inaktivität zurückgesetzt wird und nicht alle 60 Minuten. Darin liegt das erste Missverständnis.

Bei der Diskussion mit @alex habe ich vorgeschlagen, dass es eine gewisse Persistenz von CorrelationId zwischen dem Erstellen einer Entität über den Workflow und dem Workflow gibt, der letztendlich erzeugt wird ... Nun, es gibt. Die CorrelationId ist sowohl im Plug-in als auch im Workflow und allen Datensätzen, die von diesem Thread gespoolt werden, identisch.Ich suche jetzt nach Möglichkeiten, die CorrelationId (oder vielleicht die Erstellung von Datensätzen) von der Entität und dem Workflow zu entkoppeln.

    
Greg Owens 15.05.2012, 11:55
quelle

2 Antworten

2

Für die einstündige "Zurücksetzung" müssen Sie für eine Stunde KEINE Aktivität haben. Es wird nicht nur 1 Stunde vom Original zurückgesetzt. Da Sie alle 15 Minuten eine Aktivität haben, hat diese nie eine Chance, zurückgesetzt zu werden. Ich weiß nicht, dass irgendwo in Stein gesagt wird ... aber aus meiner Erfahrung.

In CRM 4 war es möglich, einen CRM-Service zu erstellen (Google Erstellen Sie einen CRM-Service in der Child-Pipeline ) und setzen Sie die Korrelations-ID (mit CorrelationToken.NewToken ()) zurück. Im SDK 2011 sehe ich nichts so einfach. Keine Ahnung, ob dieser Trick in der Online-Umgebung funktioniert. Ist 2011 online abwärtskompatibel mit CRM 4 Plugins?

Eine Sache, die Sie versuchen könnten, wäre, die IExecutionContext.CorrelationId zu verwenden, um die asyncroperation (System Job) -Tabelle aufzuspüren. Aber nach den Metadaten ist das Attribut, das ich für nützlich halte (CorrelationId, CorrelationUpdatedTime, Depth) NICHT für update gültig. Vielleicht könnten Sie die Zeilen löschen? Auch das kann nicht helfen.

    
John Hoven 15.05.2012, 12:48
quelle
2

Ich bezweifle, dass das so gelöst werden kann.

Ich würde einen anderen Ansatz vorschlagen: Stellen Sie eine einfache Anwendung neben CRM bereit und lassen Sie it den Webservice aufrufen, der wiederum die XRM-Endpunkte verwenden kann, um die Datensätze zu ändern.

>

AKTUALISIEREN

Oder Sie können so etwas bei der crm-Service-Initialisierung im Plugin versuchen (haben es von einem meiner Plugins ausgegraben) und Ihren Workflow unberührt gelassen:

%Vor%

Ich gebe zu, ich erinnere mich nicht viel daran (Code stammt aus vor etwa 2 Jahren), aber es könnte helfen.

    
Alex 15.05.2012 12:10
quelle