挂起的业务流程服务实例在Resume之后重新抛出相同的意外异常

时间:2011-05-11 17:16:43

标签: biztalk

当我尝试恢复Suspended(可恢复)编排实例时,我收到以下错误。

场景:请求已经过了DB2静态请求 - 响应端口,并且由于访问权限被拒绝而失败。我可以看到在管理控制台中暂停了两个实例,一个与端口相关,另一个与业务流程相关。修复凭据后,挂起的端口实例已恢复,但业务流程实例仍然处于失败状态。

Uncaught exception (see the 'inner exception' below) has suspended an instance of service 'Orchestration name'.
The service instance will remain suspended until administratively resumed or terminated. 
If resumed the instance will continue from its last persisted state and may re-throw the same unexpected exception.
InstanceId: ca927086-465d-40e8-93fe-c3a0e4c161f7
Shape name: 
ShapeId: 
Exception thrown from: segment -1, progress -1
Inner exception: An error occurred while processing the message, refer to the details section for more information 
Message ID: {96B72521-9833-48EF-BB2F-4A2E2265D697}
Instance ID: {F6FBC912-C9DC-489C-87F3-103FA1273FDC}
Error Description: The user does not have the authority to access the host resource. Check your authentication credentials or contact your system administrator. SQLSTATE: HY000, SQLCODE: -1000


Exception type: XlangSoapException
Source: Microsoft.XLANGs.BizTalk.Engine
Target Site: Void VerifyTransport(Microsoft.XLANGs.Core.Envelope, Int32, Microsoft.XLANGs.Core.Context)
The following is a stack trace that identifies the location where the exception occured
at Microsoft.BizTalk.XLANGs.BTXEngine.BTXPortBase.VerifyTransport(Envelope env, Int32 operationId, Context ctx)
at Microsoft.XLANGs.Core.Subscription.Receive(Segment s, Context ctx, Envelope& env, Boolean topOnly)
at Microsoft.XLANGs.Core.PortBase.GetMessageIdForSubscription(Subscription subscription, Segment currentSegment, Context cxt, Envelope& env, CachedObject location)
at Microsoft.XLANGs.Core.PortBase.GetMessageId(Subscription subscription, Segment currentSegment, Context cxt, Envelope& env, CachedObject location)
at (StopConditions stopOn)
at Microsoft.XLANGs.Core.SegmentScheduler.RunASegment(Segment s, StopConditions stopCond, Exception& exp)

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

有任何想法如何解决这个问题?

使用示例创建上述场景:

  1. 转到BizTalk 样本/配器/ consumeWebservice 文件夹,安装 ConsumeWebService应用程序和 将POWebservice发布到IIS。
  2. 更改IIS目录安全性 POWebservice的权限,删除 匿名或任何其他访问。
  3. 现在删除您将看到的消息 由于HTTP而暂停了消息 状态401:访问被拒绝,然后给 访问POWebservice也是 匿名或Windows。
  4. 然后恢复 暂停的实例,一个会 消失但是 另一个(编排)一个不会。

3 个答案:

答案 0 :(得分:5)

业务流程将继续失败并出现异常,因为当它被挂起时,最后一个持久性点是收到异常。这意味着业务流程将重新启动(恢复时)并重新抛出异常。

这篇文章讨论了将业务流程状态持久保存到数据库的一些要点:http://blogs.msdn.com/b/sanket/archive/2006/11/12/understanding-persistence-points-in-biztalk-orchestration.aspx

您可以在业务流程设计中对此进行一定程度的操作,正如Richard Seroter讨论here,但通常您最好使用failed message routing,使您能够处理失败的消息,并终止业务流程实例失败。

答案 1 :(得分:1)

如果我错了,请纠正我,但这不仅仅是正常的biztalk行为吗?我不是百分百肯定所以如果这是错误的请告诉我:

出站邮件实例已暂停,因为端口用于连接到数据库的凭据错误。

这导致编排这些调用的业务流程也暂停。

已暂停的邮件实例已恢复并已正确处理,因为问题已得到解决。所以调用了DB。

但是,业务流程实例可能无法恢复,因为在恢复时它发现自己处于最新的持久性点,并且从发送端口传回的原始错误仍可供业务流程使用,从而导致其重新启动暂停。

在错误消息中,它实际上说“如果恢复,实例将从其上一个持久状态继续,并可能重新抛出相同的意外异常。”

如果你想处理这类事情,你可以调用数据库原子。这样,业务流程就不会在进行数据库调用时保持不变。如果业务流程然后暂停,它将在DB调用之前的某个时刻恢复,并且将使DB调用正常,这次应该成功,因为您已经修复了原始问题。

唯一的问题是,如果您的数据库调用不能使用相同的数据执行多次而不会发生错误(不是幂等)。

我不是100%对上述解释。如果我的理解不正确,请指出。

答案 2 :(得分:0)

此方案未被Microsoft Biztalk = Middleware FAIL处理。

你必须在业务流程设计阶段预先解决这个问题... http://seroter.wordpress.com/2007/01/02/orchestration-handling-of-suspended-messages/