2

次のシナリオを作成しようとしています。

  • タスクがユーザーに割り当てられて完了する
  • マネージャーが必要に応じてユーザー タスクを再割り当てするためのタスクが作成されます (聞かないでください。彼らはこのようにしたかったのです)。
  • タスクの期日が近づいたときにメール リマインダーを送信する必要がある

したがって、これには EventHandlingScope を使用することを考えました。

  • eventhandlingscope アクティビティのメイン ブランチでタスクの変更をリッスンしています。
  • イベント ドリブン ブランチで再割り当てタスクの変更をリッスンし、再割り当てタスクがアクティブ化された場合は、指定されたユーザーに最初のタスクを再割り当てします
  • 別のイベント ドリブン ブランチでは、遅延アクティビティを使用し、ユーザーが割り当てたタスクが期限に近づいているかどうかを定期的に確認し、電子メール リマインダーを送信します。

そのため、私は eventhandlingscope がこれに適していると考えていましたが、DelayActivity の問題を除いて、ほとんどはそうです。

イベント ハンドラー ブランチの 1 つに遅延アクティビティを配置すると、一度だけ起動しますが、それ以上は起動しません。一方、onTaskChange アクティビティを配置すると、誰かがそのタスクを変更するたびに起動します。

それで、これは予想される動作ですか?DelayActivity がループしないのはなぜですか? どうすればこれを別の方法で行うことができますか? 私の考えはCAGですが、これはもう少し複雑に見えます...

更新: CAG の問題は、onChange イベントが発生した場合でも、遅延アクティビティが発生するまで全体がブロックされることです。これは理にかなっていますが、使用するのが少し難しくなります。

更新 2: できればわかりやすくするためにテキストを書き直しました

4

2 に答える 2

5

ソリューション

この問題を解決する基本的なアクティビティの配置は、WhileActivityを含むListenActivityです。

listen アクティビティには 3 つEventDrivenActivityの分岐があります。1 つ目は「ユーザー タスクが完了しました」ブランチ、2 つ目は「マネージャーが割り当てられたユーザーを変更しました」ブランチ、3 つ目はDelayActivity電子メール ロジックが続きます。

リッスン アクティビティでは、いずれかのブランチがリッスン アクティビティを完了することができます。リッスン アクティビティ内の他のアクティビティを実行すると、ブランチはキャンセルされます。

ユーザーがタスクを完了したときに while ループが終了するように、"User Task Completed" シーケンスが while ループでテストできる値を設定するようにする必要があります。

「User Task Completed」ブランチ以外のブランチがワークフローの完了を担当する場合、ListenActivityワークフローは にループバックし、ListenActivityを含むものを含む 3 つのイベント ドリブン アクティビティすべてを再実行しDelayActivityます。

これは EventHandlingScope アプローチとは少し異なることに注意してください。「完了したユーザー タスクのリッスン」はキャンセルされ、再実行されますが、EventHandlingScope では発生しません。IMO これは、Listen アクティビティの開始時にタスクを実行するために現在選択されていたユーザーが、最後に変更されないことが保証されることを意味するため、より適切な配置です (変更された場合、アクティビティ全体が破棄され、新しいアクティビティが開始されるため) )。

EventHandlingScope で遅延が 1 回だけ発生する理由

実際にセットアップしたのは、2 つのイベントをリッスンするスコープです。1 つは、マネージャーが割り当てられたユーザー イベントを変更したもので、もう 1 つは「タイマー起動イベント」でした。

ドキュメントに記載されている方法では、これらのアクティビティの 1 つが完了すると再開されるかのように、何らかのループが関与しているように聞こえます。ただし、実際には元のイベントをリッスンし続け、そのような別のイベントが発生した場合はコンテンツを再実行します。

の場合、DelayActivityリッスンされている内部の「タイマー起動イベント」があります。遅延が最初に入力されると、タイマーが適切な時間に起動するようにタイムアウトが設定され、そのイベントをリッスンします。スコープが起動すると、スコープは「タイマー起動イベント」のリッスンに戻りますが、タイムアウトを設定する初期コードの再実行はないため、他の「タイマー起動イベント」は発生しません。

于 2009-12-06T21:40:38.397 に答える
0

これを聞きたくないことは承知していますが、ワークフローは「長時間実行」されるため、時間ディメンションをより適切に処理するように設計されているため、ハンドラーの代わりにワークフローを作成することをお勧めします。イベントハンドラーは、瞬間的なイベントがそれらをトリガーし、アクションを完了するために、よりスコープが設定されています。それだけでなく、作成した内容から判断すると、要件が非常に単純な場合は、SharePoint Designerワークフローを作成できるため、VisualStudioを開く必要さえありません。

また、これを知っているかどうかはわかりませんが、SharePointタスクは電子メールを送信します。これらのタスクは、タスクが遅れると毎日リマインダーを送信するため、すぐに使用できる機能を使用して遅延アクティビティに対処できる場合があります。

最後に、デバッグモードで実行していて、タスクIDをハードコーディングしている場合、デバッグセッションごとに実行できるタスクは1つだけです。そうしないと、同じIDを持つ別のアイテムがSharePointに追加されたときにイベントハンドラーが停止します。これは、遅延アクティビティがブロックされる理由を説明している可能性があります。

于 2009-12-02T17:14:50.343 に答える