Workflow 工作流基础外部数据交换消息排队和事务处理?

Workflow 工作流基础外部数据交换消息排队和事务处理?,workflow,workflow-foundation,Workflow,Workflow Foundation,我最近一直在WF中处理一些基于外部数据交换的通信。我的理解是,当使用长时间运行(在本例中为状态机)工作流时,通信是排队的、持久的和事务性的 我正在使用SQL持久性和标记为“WaitForIdle=true”的EventArgs 我假设当我做这样的事情时: using(TransactionScope scope = new TransactionScope()) { IMyEDEService service = wfRuntime.GetService<IMyEDEServic

我最近一直在WF中处理一些基于外部数据交换的通信。我的理解是,当使用长时间运行(在本例中为状态机)工作流时,通信是排队的、持久的和事务性的

我正在使用SQL持久性和标记为“WaitForIdle=true”的EventArgs

我假设当我做这样的事情时:

using(TransactionScope scope = new TransactionScope())
{
     IMyEDEService service = wfRuntime.GetService<IMyEDEService>()
     service.MyMethod(wfInstanceGuid, "Here's some data");
     DoSomeDatabaseWork();
} //Dispose causes scope to rollback
使用(TransactionScope范围=新TransactionScope())
{
IMyEDEService服务=wfRuntime.GetService()
MyMethod(wfInstanceGuid,“这里有一些数据”);
DoSomeDatabaseWork();
}//Dispose导致作用域回滚
我希望我的活动不会触发工作流。但是,它看起来实际上是交付的,所以这让我相信这不是事务性的。您可以看到DoSomeDatabaseWork()中提交给数据库的数据是如何回滚的,但向前移动的工作流可能不好

有人能确认这一点吗?如果有,您是否有一个变通方法使消息成为事务性消息

我真正想要的是以下两件事之一:

  • 在提交将消息排入队列的事务之前,工作流不应对通过外部数据交换排入队列的消息做出反应(很像SQLServer中的ServiceBroker)
  • --或--

  • 如果工作流确实开始对我交付的事件执行操作,那么它也应该回滚。不过,我不知道使用默认的调度程序如何实现这一点。我希望工作流执行保持异步,因此如果不需要,我不想关闭调度程序

  • 这里有几个问题。首先,当您使用SQL持久性时,向工作流通知事件并让工作流发布事件是持久和异步的,工作流的底层管道是事务性的……但不是您可能认为的方式

    如果在事件序列的某个地方发生了可怕的事情,最终会导致您的工作流转换到新状态,那么工作流将恢复到尝试活动之前的状态-这会使工作流保持一致状态,因为“状态之间”是一个坏主意

    如上所述使用事务作用域是可以的,但您必须记住,事务作用域实际工作的唯一时间是当Using块中的类知道事务作用域时

    您可以做的是将对“MyMethod”的调用封装在try/catch块中。当出现问题时,您可以投票支持回滚。。。但这仍然不能“取消调用”EDE上的方法

    如果您可以给出一些关于您试图在更高级别上完成的任务的细节,那么WF中可能有一些固有的东西比试图将事务范围硬塞进组合中更适合您

    编辑 我做了一些挖掘,发现了几个不同的地方,我们被告知没有API来操作调度器工作队列。不幸的是,这意味着任何我们想要的回滚行为都必须自己手动实现

    如果我知道更多关于您为什么试图回滚通过EDES排队的工作的原因,我可能能够建议一些潜在的体系结构来完成您的任务,而无需重新发明轮子(事务)


    10次中有9次我遇到这样的问题,WF似乎不支持我正在尝试做的事情,问题在于,我要么在工作流程之外保留了太多的代码,要么试图在工作流程中加入太多的代码,而在完成工作的地方进行重构通常可以解决我的问题,而不需要我写新的东西。

    我更新了原始帖子,以便更清楚地了解我想要的结果。更新了我的回复。。。希望这将为您提供一个更好的起点?作为我们流程的一部分,我们要求一些外部数据和状态机工作流保持一致。我们不希望工作流表明在数据库更改实际回滚时工作已经完成。这可以归结为基本的事务一致性。我没有忘记您对工作流内外代码的评论,但是,在这种情况下,不可能让工作流对此过程承担更多责任。我以前遇到过这个问题。在这种情况下,我必须实际减少工作流的责任,仅在交易完成时通过EDE通知工作流,要求发送在WF之外进行。当然不理想,但如果没有TX EDES,我们能做什么?