Exception handling BizTalk不断要求初始化已初始化的消息
在我的编排中,我有各种步骤将平面文件映射到2条中间消息,并最终写入SQL。首先,我毫无例外地处理了它,它使用了一个有效的输入文件Exception handling BizTalk不断要求初始化已初始化的消息,exception-handling,initialization,biztalk,biztalk2006r2,message-type,Exception Handling,Initialization,Biztalk,Biztalk2006r2,Message Type,在我的编排中,我有各种步骤将平面文件映射到2条中间消息,并最终写入SQL。首先,我毫无例外地处理了它,它使用了一个有效的输入文件 msg0 msg1 msg2 ┌──────┐ ┌─────┐ ┌───────┐ ┌───────┐ ┌─────┐ │ PIPE │-►│ RCV │-►│ MAP_1 │-►│ MAP_2 │-►│ SQL │ └──────┘ └─────┘ └───────┘ └───────┘ └─
msg0 msg1 msg2
┌──────┐ ┌─────┐ ┌───────┐ ┌───────┐ ┌─────┐
│ PIPE │-►│ RCV │-►│ MAP_1 │-►│ MAP_2 │-►│ SQL │
└──────┘ └─────┘ └───────┘ └───────┘ └─────┘
现在,我正在尝试获取使用映射的每个范围的异常。
在业务流程开始时,在第一个接收形状之后,我放置了一个构造消息形状,用于初始化业务流程中的所有消息。
我创建catch块(每个块都有fault_msg的构造形状及其发送形状)、文件端口和build
msg0 msg1 msg2
┌──────┐ ┌─────┐ ┌──────┬──┐ ┌───────┬──┐ ┌───────┬──┐ ┌─────┬──┐
│ PIPE │-►│ RCV │-►│ INIT │ex│-►│ MAP_1 │ex│-►│ MAP_2 │ex│-►│ SQL │ex│
└──────┘ └─────┘ └──────┴──┘ └───────┴──┘ └───────┴──┘ └─────┴──┘
VS一直要求msg初始化,即使在映射块中,对于应该输入已填充(或已填充,或任何术语)的消息也是如此。
为什么呢
编辑:我发现BT希望初始化每个消息,即使在异常处理期间未使用。因此,我需要构造自定义错误消息,该消息将与自定义错误消息一起返回空消息。为了初始化它们,我当然需要在表达式代码的开头这样声明:
unusedMsg.Part = new System.Xml.XmlDocument();
现在的情况是:最后一个映射(sql)仍然存在问题:
它一直在问这个问题:
msg2.Part”:消息部分尚未在构造语句中初始化
但我确信msg2已经初始化,因为我在生成它时没有异常,我正在进入新的范围。
这是怎么可能的?在BizTalk中,在以下情况下出现错误“消息部分尚未在构造语句中初始化”
CORRECT WRONG
┌──────────────────────┐ ┌──────────────────────┐
│ CONSTRUCT MESSAGE │ │ CONSTRUCT MESSAGE │
│ messages constructed │ │ messages constructed │
│ sqlReq │ │ sqlReq, msg2 │
│ ┌────────────────┐ │ │ ┌────────────────┐ │
│ │ MAP │ │ │ │ MAP │ │
│ │ msg2 > sqlReq │ │ │ │ msg2 > sqlReq │ │
│ └────────────────┘ │ │ └────────────────┘ │
└──────────────────────┘ └──────────────────────┘
CORRECT WRONG
┌──────────────────────┐ ┌──────────────────────┐
│ Construct │ │ Construct │
│ messages constructed │ │ messages constructed │
│ sqlReq, sqlReq2 │ │ sqlReq, sqlReq2 │
│ ┌────────────────┐ │ │ │
│ │ MAP │ │ │ │
│ │ msg2 > sqlReq │ │ │ │
│ └────────────────┘ │ │ │
│ ┌────────────────┐ │ │ ┌────────────────┐ │
│ │ MAP │ │ │ │ MAP │ │
│ │sqlReq > sqlReq2│ │ │ │sqlReq > sqlReq2│ │
│ └────────────────┘ │ │ └────────────────┘ │
└──────────────────────┘ └──────────────────────┘
这证实了我处理异常的方式没有错。由于与VS属性选项卡可见性相关的原因,我没有看到构造形状也将msg2指定为构造的MSG之一(可能来自复制粘贴)。我将保留此作为将来类似错误的参考!谢谢@Dijkgraafi相应修改。。。它仍然在请求这些未使用的消息。Biztalk也在考验我的耐心和对仪器动力学的理解。C#编译器从不抱怨(警告除外)未使用的未实例化变量。他们的名字是这样的。。。为什么工具会要求对流程生命周期中未使用的内容进行实例化?@strongmmc在修复第一个错误后,如果使用未构造消息,您将点击#3。必须像对待try/catch块一样对待作用域。sqlReg&msgErr都只在作用域的一部分中创建,因此不能在作用域之后使用。我将尝试在我的答案中添加更多细节,以突出一些您可以使用的模式。另外,你真的只有一张地图吗?我通常不会试图从一个形状中捕捉错误。是的,我为地图划分了一个范围。我被要求为每个阶段制作一个跟踪消息(这部分不包括在上面的orch设计中)。因此,每个范围的捕获。我可以直接用一个发送端口和一些过滤器来实现它,可能这就是我将要实现的一个模块。我有一封电子邮件,一封由两部分组成的多部分邮件,一部分是正文,一部分是附件。我把一封成功的电子邮件复制到了一封只有正文部分的错误电子邮件。错误电子邮件不需要附件。因为我没有设置attachmentPart,所以出现了这个错误。解决方案是创建第二个只包含bodyPart的多部分消息类型。总之,如果有多部分消息,则需要为每个部分设置一个值。
CORRECT WRONG
┌──────────────────────┐ ┌──────────────────────┐
│ Construct │ │ Construct │
│ messages constructed │ │ messages constructed │
│ sqlReq, sqlReq2 │ │ sqlReq, sqlReq2 │
│ ┌────────────────┐ │ │ │
│ │ MAP │ │ │ │
│ │ msg2 > sqlReq │ │ │ │
│ └────────────────┘ │ │ │
│ ┌────────────────┐ │ │ ┌────────────────┐ │
│ │ MAP │ │ │ │ MAP │ │
│ │sqlReq > sqlReq2│ │ │ │sqlReq > sqlReq2│ │
│ └────────────────┘ │ │ └────────────────┘ │
└──────────────────────┘ └──────────────────────┘