8

アップデート

最初から追加する必要がありました - これは Microsoft Dynamics CRM 2011にあります


CRM についてはよく知っていますが、現在の展開での動作を説明するには途方に暮れています。

私の推測/理解のどれが間違っているか (したがって、このエラーの原因は何か) を理解するために、私のシナリオの概要をお読みください。それは私の期待と一致しません。

基本シナリオ

  • 要件では、X 分ごとに Web サービスを呼び出す必要があります (保留中のアイテムをデータベース インデックスに追加します)。
  • ワークフロー/カスタム エンティティ トリガー モデルを使用することを選択しました (つまり、CREATE プラグインが登録されたカスタム エンティティがあります。プラグインはロジックを実行します。「完了」時間 + [タイムアウト期間]が経過すると、付随するワークフローが開始されます。有効期限が切れると、新しいトリガー レコードが作成され、ワー​​クフローが終了します)。
  • プラグイン ロジックは問題なく動作します。ワークフローの概念はある程度は正常に機能しますが、しばらくするとワークフローが失敗して失速します。

    このワークフロー ジョブは、それを開始したワークフローに無限ループが含まれていたためキャンセルされました。ワークフロー ロジックを修正し、再試行してください。ワークフロー ロジックの詳細については、ヘルプを参照してください。

つまり、一言で言えば、標準の無限ループ検出です。概念とその存在理由を理解しています。

特定の展開

まず、このシナリオではプラグイン コードの内容を無視しても問題ないと思います。それは正常に動作し、原子的であり、CRM にはほとんど触れません (明確にするために、これはリモート Web サービスを実行し、応答を待ってから、トリガー レコードに "完了" 日付/時刻属性を設定してから渡す前のイベント プラグインです)ターゲット エンティティをパイプラインに戻します) 。Trigger レコードが作成されている限り、このコードは実行され、必要な処理を実行します。

プラグインの内容を割り引いたので、エンティティの事前作成ステップでプラグインを登録することに不満があるかもしれません...

したがって、ワークフロー自体は残ります。それは単純なものです。次のように実行されます。

  1. 新しいトリガー エンティティの作成時...
  2. Trigger.new_completedon + 15分のタイムアウトがあります
  3. タイムアウト時に、新しいトリガー レコードを作成します (「完了」値なし - これはプラグインによって設定されます)
  4. それだけです-明示的な「ワークフローの終了」はありません(ただし、今追加したばかりで、テストに設定します...)

この設定で、新しいトリガー レコードを手動で作成すると、プロセスがうまく実行されます。ロール フォワード 1 時間 58 分 (最後に実行したサイクルに基づく - プラグイン コードの実行が完了するまでに 1 分かかる場合があることを思い出してください)、7 回の実行サイクルが成功した後 (つまり、新しいワークフロー ジョブが作成されて完了)、8 回目のサイクルは失敗し、前述のエラー。

私がすでに知っていること(間違っているところを修正してください)

デフォルトでは、再帰の深さは 8 に設定されています。ワークフロー/プラグインが自分自身を 8 回呼び出すと、無限ループが検出されます。

再帰の深さは 1 時間ごとにリセットされます(または 10 分 - リンクされたブログの「警告」を参照してください?)

再帰の深さの設定は、PowerShellまたは SDK コードを介して、オンプレミス展開でのみ展開 Web サービスを使用して 設定できます( Set-CrmSetting Cmdlet を使用) 。

聞きたくないこと (プリーズ)

「再帰の深さの設定を変更する」

これはオンライン シナリオのオプションではないため、展開の再帰の深さの設定を変更することはできません。最終的には、CRM Online にも展開する予定です。

ワークフローのタイムアウト期間を増やしてください

これもオプションではありません。再インデックスは 15 分ごとに、理想的にはそれより早く行う必要があります。

アップデート

@Boone は、再帰の深さのタイムアウトが 60 分ごとではなく、 60 分間非アクティブになった後にリセットされることを以下に提案しました。そこに最初の誤解があります。

@alex と話し合っているときに、ワークフローを介したエンティティの作成と、Ultimate が生成されるワークフローとの間に CorrelationId の永続性がある可能性があることを提案しました...まあ、あります。CorrelationId は、プラグインとワークフロー、およびそのスレッドからスプールするすべてのレコードの両方で同じです。現在、エンティティとワークフローから CorrelationId (またはおそらくレコードの作成) を分離する方法を検討しています。

4

2 に答える 2

3

1時間の「リセット」が行われるためには、1時間アクティビティがない必要があります。元の状態からわずか1時間でリセットされるわけではありません。したがって、15分ごとにアクティビティがあるため、リセットする機会はありません。それがどこでも石で言われているのかわかりません...しかし私の経験から。

CRM 4では、CRMサービスを作成し(Googleが子パイプラインにCRMサービスを作成)、相関IDをリセットすることができました(CorrelationToken.NewToken()を使用)。2011SDKにはそれほど簡単なものはありません。このトリックがオンライン環境で機能したかどうかはわかりません。2011オンラインはCRM4プラグインと下位互換性がありますか?

IExecutionContext.CorrelationIdを使用して、非同期操作(システムジョブ)テーブルを清掃することもできます。しかし、メタデータによると、役立つと思われる属性(CorrelationId、CorrelationUpdatedTime、Depth)は更新には無効です。 たぶんあなたは行を削除することができますか?それでも役に立たないかもしれません。

于 2012-05-15T12:48:57.610 に答える
3

このように解決できるとは思えません。

別のアプローチをお勧めします。単純なアプリケーションを CRM と一緒に展開し、Web サービスを呼び出すようします。Web サービスは XRM エンドポイントを使用してレコードを変更できます。

アップデート

または、プラグインでの crm サービスの初期化時に次のようなことを試すことができます (私のプラグインの 1 つから掘り出しました)。ワークフローはそのままにしておきます。

CrmService service = new CrmService();
//initialize service here, then...

CorrelationToken newtoken = new CorrelationToken();
newtoken.CorrelationId = context.CorrelationId;
newtoken.CorrelationUpdatedTime = context.CorrelationUpdatedTime;

// WILD GUESS: Enforce unlimited depth ?
corToken.Depth = 0; // THIS WAS: context.Depth;

//updating correlation token
service.CorrelationTokenValue = corToken;

これについてあまり覚えていないことは認めますが (コードは約 2 年前にさかのぼります)、役に立つかもしれません。

于 2012-05-15T12:10:32.660 に答える