我有一个工作流服务,它接受一个产品对象,然后将其放入一个必须由经理批准的队列中。有可能将产品重新提交到此过程中,如果是这种情况,我想取消现有的工作流程(即等待批准)。产品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块。
因此,我的问题是如何:
或许有更好的方法可以做到这一点?我不想做的一件事是在客户端捕获异常并从那里开始。我的客户对WF一无所知,我希望他们继续使用服务接口,而不必在客户端中放置任何重试/取消逻辑(实际上应该可以在工作流本身中包含所有这些) )。
任何帮助表示赞赏!