0

我有以下称为任务的状态机:

开始 -> A -> B -> 完成

B 和完成之间的转换是一种称为 CompleteTask 的单向接收活动。似乎当工作流实例处于状态 A 时,对 CompleteTask 的任何调用都会排队。当状态转移到 B 时,调用将立即执行。如果 CompleteTask 是双向调用,它将具有相同的行为,只是客户端将挂起并等待响应。由于工作流程处于错误状态,因此通常会导致超时。

这对我来说有点出乎意料。我希望当用户进行“状态外”调用时,工作流引擎只会给我一个异常。

在相关性方面,我使用了一个名为 taskInstanceID 的全局 CorrelationHandle。我有一种感觉,local correlationHandle 可能是解决这个问题的关键。

对此有什么想法吗?有什么方法可以在工作流基础中使“状态外”调用非法?

谢谢!

4

2 回答 2

0

我通过在状态级别使用本地化相关句柄来解决这个问题。通过这样做,状态外调用将获得相关性未找到异常。

于 2013-04-30T16:51:17.843 回答
0

看来我误解了 WPF 中接收 msg 排队的行为。

在创建了一系列测试项目之后,我观察到了以下内容:

仅当工作流处于事务中时,来自客户端的接收消息才会排队。一旦遇到接收活动,它将丢弃队列中的任何无效消息,并仅处理与接收活动匹配的消息。

例如:测试工作流程

开始 -> 延迟 A(5 秒)-> 接收 A -> 延迟 B -> ReceiveReply B -> 完成

工作流开始后,客户端立即发送 A 和 B。请注意,A 是单向请求,B 是双向请求。工作流引擎将在延迟 A 阶段对这两个请求进行排队。一旦它命中 Receive A,它将立即抛出请求 B。由于 B 是双向请求,客户端将经历 5 秒的阻塞,然后将被异常命中。

似乎相关句柄的范围与此行为无关。

希望这对其他人有帮助。

于 2013-06-28T02:55:00.547 回答