3

在我的编排中,我有多个步骤将平面文件映射到 2 个中间消息并最终写入 SQL。首先,我在没有异常处理的情况下完成了它,它使用了一个有效的输入文件。

                msg0        msg1       msg2
┌──────┐  ┌─────┐  ┌───────┐  ┌───────┐  ┌─────┐
│ PIPE │-►│ RCV │-►│ MAP_1 │-►│ MAP_2 │-►│ SQL │
└──────┘  └─────┘  └───────┘  └───────┘  └─────┘

现在我正在尝试获取我使用地图的每个范围的例外情况。在编排开始时,在第一个 Receive Shape 之后,我放置了一个 Construct Message Shape 来初始化编排中的所有消息。我创建了 catch 块(每个都具有我的 fault_msg 及其发送形状的 Construct 形状)、FILE 端口和构建。

                             msg0          msg1          msg2
┌──────┐  ┌─────┐  ┌──────┬──┐  ┌───────┬──┐  ┌───────┬──┐  ┌─────┬──┐
│ PIPE │-►│ RCV │-►│ INIT │ex│-►│ MAP_1 │ex│-►│ MAP_2 │ex│-►│ SQL │ex│
└──────┘  └─────┘  └──────┴──┘  └───────┴──┘  └───────┴──┘  └─────┴──┘

VS KEEPS ASKING for msg 初始化,即使在地图块中,应该输入已经填充(或填充,或任何术语)的消息。这是为什么?

编辑:我发现BT希望每个味精都被初始化,即使在异常处理期间不使用也是如此。所以我需要构建我的自定义错误消息,它将与我的自定义错误消息一起返回空消息。当然,为了初始化它们,我需要以这种方式在表达式代码的开头声明:

    unusedMsg.Part = new System.Xml.XmlDocument();

现在的事情是:最后一个映射(sql)的问题仍然存在:

           ┌──────────────────────┐
           │        scope         │
           │  ┌────────────────┐  │ 
┌──────┐   │  │      MAP       │  │    ┌────────┐
│ msg2 │ -►│  │ msg2  > sqlReq │  │ -► │ sqlReq │
└──────┘   │  └────────────────┘  │    └────────┘
           ├──────────────────────┤
           │         ex           │
           │  ┌────────────────┐  │
           │  │   construct    │  │    ┌────────┐
           │  │ msg2  > msgERR │  │ -► │ msgERR │
           │  └────────────────┘  │    └────────┘
           └──────────────────────┘

它一直在问这个:

msg2.Part':消息部分尚未在构造语句中初始化

但我确定 msg2 已初始化,因为我没有例外地生成它,并且我正在进入新的范围。 这怎么可能?

4

1 回答 1

2

BizTalk中以下情况出现“消息部分尚未在构造语句中初始化”错误

  1. 您的构造形状正在构造与源消息之一相同的消息。例如,在下面,您需要从构造的消息中删除 msg2。

                  CORRECT                                  WRONG
           ┌──────────────────────┐               ┌──────────────────────┐
           │   CONSTRUCT MESSAGE  │               │   CONSTRUCT MESSAGE  │
           │ messages constructed │               │ messages constructed │
           │     sqlReq           │               │     sqlReq, msg2     │
           │  ┌────────────────┐  │               │  ┌────────────────┐  │
           │  │      MAP       │  │               │  │      MAP       │  │
           │  │ msg2  > sqlReq │  │               │  │ msg2  > sqlReq │  │
           │  └────────────────┘  │               │  └────────────────┘  │
           └──────────────────────┘               └──────────────────────┘
    
  2. 您正在构造形状中构造多条消息,但稍后的消息取决于您在构造中较早初始化另一条缺少的消息。

                  CORRECT                                  WRONG
           ┌──────────────────────┐               ┌──────────────────────┐
           │        Construct     │               │        Construct     │
           │ messages constructed │               │ messages constructed │
           │     sqlReq, sqlReq2  │               │     sqlReq, sqlReq2  │
           │  ┌────────────────┐  │               │                      │
           │  │      MAP       │  │               │                      │
           │  │ msg2  > sqlReq │  │               │                      │
           │  └────────────────┘  │               │                      │
           │  ┌────────────────┐  │               │  ┌────────────────┐  │
           │  │      MAP       │  │               │  │      MAP       │  │
           │  │sqlReq > sqlReq2│  │               │  │sqlReq > sqlReq2│  │
           │  └────────────────┘  │               │  └────────────────┘  │
           └──────────────────────┘               └──────────────────────┘
    

出现以下错误“使用未构造的消息”。

  1. 您正在尝试将消息用作范围内的源,该范围内既未在范围开始时也未在范围内的构造形状之前初始化。

  2. 您试图在异常块中使用一条消息,该异常块在您试图捕获异常的范围内初始化。

  3. 您在仅在某些范围区域中构建的范围之后使用消息。它需要在所有范围区域中构建。

于 2016-12-07T00:53:32.253 回答