取消现有的WF实例

时间:2013-01-11 15:41:27

标签: workflow-foundation

我有一个工作流服务,它接受一个产品对象,然后将其放入一个必须由经理批准的队列中。有可能将产品重新提交到此过程中,如果是这种情况,我想取消现有的工作流程(即等待批准)。产品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块。

因此,我的问题是如何:

  1. 从InitializeCorrelation活动中捕获异常?
  2. 我可以在CodeActivity中包装InitializeCorrelation(我已经按照一个示例来执行此操作,但是当我尝试使用它时,它似乎没有正确地记录相关性并允许我将相同的产品传递到多个实例中一个问题)。我正在设置相关句柄和数据,但我看不出如何调用活动执行方法。
  3. 在我调用InitializeCorrelation之前,我是否可以查询所有现有实例,其中相关ID等于我的产品ID?
  4. 或许有更好的方法可以做到这一点?我不想做的一件事是在客户端捕获异常并从那里开始。我的客户对WF一无所知,我希望他们继续使用服务接口,而不必在客户端中放置任何重试/取消逻辑(实际上应该可以在工作流本身中包含所有这些) )。

    任何帮助表示赞赏!

0 个答案:

没有答案