1

製品オブジェクトを取得し、それをマネージャーによる承認が必要なキューに入れるワークフローサービスがあります。製品がこのプロセスに再送信される可能性があります。その場合は、既存のワークフロー(承認待ち)をキャンセルしたいと思います。製品IDは相関に使用されます。

私のワークフローでは、製品オブジェクトを取得して変数に割り当てる受信アクティビティがありました。次に、変数の製品IDを使用して初期化する別のInitializeCorrelationアクティビティがありました。次に、ワークフローは製品を呼び出し元のクライアントに返します。

同じ製品をサービスに2回送信すると、2回目の呼び出しで、サービスはタイプの障害例外を返します。

System.Runtime.DurableInstancing.InstanceKeyCollisionException

次のエラーメッセージが表示されます...

"The execution of an InstancePersistenceCommand was interrupted by a key collision. The instance key with value 'fd923b75-003e-13d9-0c96-21ed171fdb43' could not be associated to the instance because it is already associated to a different instance."

...これは基本的に私が期待することです。私の計画は、InitializeCorrelationアクティビティをtry / catchアクティビティでラップすることでした。キャッチでは、既存のWFインスタンスをキャンセルして、インスタンスの実行を続行しました。したがって、catchには、既存のWFインスタンスをキャンセルするカスタムアクティビティと、最初のインスタンスがその時点でキャンセルされているためエラーをスローしない別のinitializeCorrelationアクティビティがあります。

ただし、ワークフローをステップスルーすると、InitializeCorrelationアクティビティに到達しますが、そのアクティビティでは例外が適切に発生しないようです。InitializeCorrelationアクティビティは、実行中のインスタンスを中止し、catchブロックにヒットすることはありません。

したがって、私の質問は、どうすれば次のいずれかができるかということです。

  1. InitializeCorrelationアクティビティから例外をキャッチしますか?
  2. InitializeCorrelationをCodeActivityでラップできますか(これを行う例に従いましたが、使用しようとすると、相関関係が適切に記録されていないようで、同じ製品を問題なく複数のインスタンスに渡すことができます) 。相関ハンドルとデータを適切に設定していますが、アクティビティ実行メソッドを呼び出す方法がわかりません。
  3. InitializeCorrelationを呼び出す前に、既存のすべてのインスタンスに、製品IDと等しい相関IDを持つインスタンスを照会できますか?

または、おそらくこれを行うためのより良い方法がありますか?私がやりたくないことの1つは、クライアント側で例外をキャッチし、そこから実行することです。私のクライアントはWFについて何も知らないはずであり、サービスインターフェイスでの作業を継続し、クライアントに再試行/キャンセルロジックを配置する必要がないことを望んでいます(実際、ワークフロー自体にこれらすべてを含めることができるはずです)。 )。

助けていただければ幸いです。

4

0 に答える 0