如何在发送形状之前保留BizTalk业务流程 - 用于重新发送

时间:2013-12-23 19:21:04

标签: wcf biztalk biztalk-orchestrations

我有一个调用WCF服务的业务流程,这是一个双向请求/响应发送端口。像这样:

Orchestration

我一直试图找到一种方法让业务流程在发送形状之前保持状态。这是希望当有异常或端点关闭时,我可以恢复业务流程并让它尝试重新发送到端点。

我尝试在各种范围形状中包装发送/接收形状,以使其在发送形状上方保持不变,但无济于事。我上下阅读了Seroter的博客并尝试了他帖子中建议的所有内容:

http://seroter.wordpress.com/2007/01/02/orchestration-handling-of-suspended-messages/

例如,如果我取下端点并发送给它,我会得到一个

  

System.ServiceModel.ServiceActivationException:无法激活所请求的服务“https://my-service.svc”。   在管理恢复或终止之前,服务实例将保持暂停状态。   如果恢复,则实例将从其上一个持久状态继续,并可能重新抛出相同的意外异常。

这是可以预料的。正如它所说的那样,实例可能会在恢复时重新抛出同样的异常(无论我尝试过什么,都会这样做。)

我尝试过的事情:

  • 在原子范围内包装Send形状,但在抛出异常后它仍然会被暂停。
  • 在原子范围内包装发送和接收形状,但在编译时遇到错误:
      

    错误1原子范围可能不包含或调用包含“使用”端口或服务链接上的请求响应操作的发送和相应接收的服务或范围

  • 尝试在长时间运行的范围中包装Send和Receive形状并捕获异常,然后使用挂起形状 - 但这只会导致等待来自WCF服务的响应的脱水实例。

我不确定我能尝试的其他任何东西。基本上我要问的是,我怎样才能让业务流程在包含图像中看到的“conWrapper”(或者sendRCMR上方的任何地方......)的形状中持续存在?

2 个答案:

答案 0 :(得分:4)

对于您所描述的内容,您实际上并不需要强制使用业务流程持久性。

如果端点关闭,或者适配器抛出任何其他错误,则Messaging实例将首先进入重试模式,然后暂停。这可能是您所包含的错误消息所指的“实例”。

端点再次运行后,您将恢复Messaging实例。

这是最常见的情况。

答案 1 :(得分:1)

将变量默认为false。

在发送/接收形状周围放置一个长运行范围,并在发送后将变量设置为true的表达式形状,包含所有异常的catch块(通常一个用于SOAP,一个用于System.Exception和一个General)发送警报然后在发送警报后暂停形状。

在示波器周围放置一个循环形状,而假,循环。

这将允许您恢复Orchestration,直到成功发送。