BizTalk продолжает запрашивать инициализацию УЖЕ инициализированных сообщений

В моей оркестровке у меня есть различные шаги, которые сопоставляют плоский файл с двумя промежуточными сообщениями и в конечном итоге записывают в SQL. Сначала я сделал это без обработки исключений, и он работал с допустимым входным файлом.

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

Теперь я пытаюсь получить исключения для каждой области, где я использую карту. в начале оркестровки, после первой формы приема, я помещаю форму сообщения конструкции, которая инициализирует все сообщения в оркестровке. Я создаю блоки catch (каждый с формой Construct для моего fault_msg и формой отправки), порт FILE и build.

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

VS ПРОДОЛЖАЕТ ИНИЦИАЛИЗИРОВАТЬ msg даже в блоках карты для сообщений, которые должны вводиться УЖЕ заполненными (или заполненными, или любым другим термином). Это почему?

EDIT: я выяснил, что BT хочет, чтобы каждое сообщение инициализировалось, даже если оно не используется во время обработки исключений. Поэтому мне нужно создать собственное сообщение об ошибке, которое будет возвращать пустые сообщения вместе с моим собственным сообщением об ошибке. Чтобы их инициализировать, конечно, мне нужно объявить в начале кода выражения следующим образом:

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

Дело в том, что проблема все еще возникает для последнего сопоставления (sql):

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

где он продолжает спрашивать это:

msg2.Part': часть сообщения не была инициализирована в операторе конструкции

и еще я точно знаю, что msg2 ИНИЦИАЛИЗИРУЕТСЯ, потому что у меня не было исключений, производящих его, и я вхожу в новую область. Как это возможно?


person strongmmc    schedule 06.12.2016    source источник


Ответы (1)


Ошибка «часть сообщения не была инициализирована в операторе конструкции» возникает при следующих обстоятельствах в 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. Вы используете сообщение после области, которая создается только в некоторых областях области. Его необходимо построить во всех сферах деятельности.

person Dijkgraaf    schedule 07.12.2016
comment
Это подтвердило, что я не ошибся в том, как я обрабатывал свое исключение. по причинам, связанным с видимостью вкладки свойств VS, я не видел, чтобы форма конструкции также указывала msg2 как одно из созданных msgs (возможно, из копирования-вставки). Я сохраню это как ссылку для будущих подобных ошибок! спасибо @Dijkgraaf - person strongmmc; 07.12.2016
comment
я изменил соответственно ... и он все еще запрашивает эти неиспользуемые сообщения. Biztalk испытывает мое терпение и мое понимание динамики инструментов. Компилятор C# никогда не жалуется (кроме предупреждений) на неиспользуемые переменные без экземпляра. Они названы, и все... Зачем инструменту запрашивать экземпляр чего-то, что не используется в течение жизненного цикла процесса? - person strongmmc; 07.12.2016
comment
@strongmmc Глядя на ваш вопрос, после исправления первой ошибки вы нажмете # 3 для использования несконструированного сообщения. Вы должны обращаться с областями так же, как с блоком try/catch. Оба ваших sqlReg и msgErr создаются только в одной части области, поэтому вы не можете использовать их после области. Я постараюсь добавить больше деталей в свой ответ, чтобы выделить некоторые шаблоны, которые вы можете использовать. P.S. У вас действительно есть только карта в вашем прицеле? Обычно я не пытался поймать ошибку из одной формы. - person Dijkgraaf; 07.12.2016
comment
Да, я отделил одну область для карты. Меня попросили создать сообщение для каждого этапа (эта часть не включена в приведенный выше дизайн орка). Следовательно, улов для каждой области. Я мог бы сделать это напрямую с портом отправки и некоторыми фильтрами, и, вероятно, это мод, который я собираюсь реализовать. - person strongmmc; 08.12.2016
comment
Вот еще один случай, который может вызвать это. У меня было электронное письмо, состоящее из двух частей: bodyPart и attachmentPart. Я скопировал успешное электронное письмо, в котором были оба, в электронное письмо об ошибке, в котором был только bodyPart. Письмо с ошибкой не требовало вложения. Поскольку я не установил вложение, я получил эту ошибку. Решение состояло в том, чтобы создать второй составной тип сообщения, содержащий только bodyPart. Таким образом, если у вас есть сообщение, состоящее из нескольких частей, вам необходимо установить значение для каждой части. - person NealWalters; 09.02.2021