我有一个工作流服务,它接受一个产品对象,然后将其放入一个队列中,从那里它必须得到经理的批准。产品可能会重新提交到此流程中,如果是这种情况,我想取消现有的工作流程(正在等待批准)。产品 ID 用于关联。
在我的工作流程中,我有一个接收活动,它获取产品对象并将其分配给一个变量。然后我有一个单独的 InitializeCorrelation 活动,它使用变量中的产品 id 进行初始化。然后,工作流将产品返回给调用客户端。
如果我两次将相同的产品发送到服务,那么在第二次调用时,服务将返回类型的错误异常
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."
...这基本上是我所期望的。我的计划是用 try/catch 活动包装 InitializeCorrelation 活动,并在 catch 中取消现有的 WF 实例并继续运行实例。因此,catch 将有一个自定义活动来取消现有的 WF 实例和另一个 initializeCorrelation 活动,该活动不应引发错误,因为此时第一个实例已被取消。
然而,逐步完成工作流会发生什么是它到达 InitializeCorrelation 活动,但该活动似乎没有正确引发异常。InitializeCorrelation 活动中止正在运行的实例并且永远不会命中 catch 块。
因此,我的问题是我怎么能:
- 从 InitializeCorrelation 活动中捕获异常?
- 我可以将 InitializeCorrelation 包装在 CodeActivity 中吗(我遵循了一个这样做的示例,但是当我尝试使用它时,它似乎没有正确地注意到相关性并允许我将相同的产品传递给多个实例而没有问题) . 我正在正确设置相关句柄和数据,但我看不到如何调用活动执行方法。
- 在我调用 InitializeCorrelation 之前,我可以查询所有现有实例以获取相关 ID 等于我的产品 ID 的实例吗?
或者也许有更好的方法来做到这一点?我不想做的一件事是在客户端捕获异常并从那里执行。我的客户不应该对 WF 有任何了解,我希望他们继续使用服务接口,而不必在客户端中放置任何重试/取消逻辑(实际上应该可以将所有这些都包含在工作流本身中) )。
任何帮助表示赞赏!