Отправка и получение во время атомарной транзакции в BizTalk

У меня есть Biztalk 2013 Orchestration, где я работаю над элементом, который дебатирует сообщение с помощью вызова конвейера. Затем я беру рассмотренные сообщения, используя их для создания запросов адаптера SQL WCF для получения подробной информации, а затем проверяю ответы и записываю их в систему.

Образцы XML:

Конверт с заказами

<Orders>
  <Order>
     <OrderNum>1</OrderNum>
  </Order>
  <Order>
     <OrderNum>2</OrderNum>
  </Order>
  <Order>
     <OrderNum>3</OrderNum>
  </Order>
  <Order>
     <OrderNum>4</OrderNum>
  </Order>
  <Order>
     <OrderNum>5</OrderNum>
  </Order>
  <Order>
     <OrderNum>6</OrderNum>
  </Order>
  <Order>
     <OrderNum>7</OrderNum>
  </Order>
</Orders>

Разбирается в отдельных сообщениях с заказами:

<Order>
    <OrderNum>1</OrderNum>
</Order>
  .
  .
  .

Это передается в SQL путем создания сохраненного сообщения вызова процедуры с порядковым номером в качестве параметра.

Ответ:

<OrderDetails>
    <OrderDetail>
          <ItemID>1</ItemID>
          <Price>23.40</Price>
    </OrderDetail>
       .
       .
       .
</OrderDetails>

Затем я перехожу к отдельным записям OrderDetail, используя конвейер в оркестровке.

В любом случае, когда я вызываю SQL Server и получаю ответ, я получаю ошибку при компиляции о

"an atomic scope may not contain or call a service or scope that contains both the send and the corresponding receive of a requestresponse operation on a 'uses' port or servicelink".

Я изменяю уровень транзакции объекта области (необходимого для дебатчинга) с атомарного на длительный и получаю эту ошибку.

"a non-serializable object type 'Microsoft.XLANGs.Pipeline.ReceivePipelineOutputMessages GetBatchPipelineOutput' can only be declared within an atomic scope or service"

Мне нужно получить отдельные элементы в списке (это может быть длинный список, поэтому я использовал конвейер) и передать их в качестве аргументов серверу SQL, но, похоже, я не могу.

Любые идеи?


person SpaceCowboy74    schedule 01.02.2014    source источник


Ответы (1)


К сожалению, вы застряли в штрафной Атомика. Однако то, что вы хотите, безусловно, может быть сделано, если вы согласитесь с изменением своего ожидаемого поведения.

Вы можете переместить последующую обработку, вызов SQL и т. П. Логику в Start'ed Orchestration (а не в Called), которая ускользнет от вашей атомарной области Debatching Orchestration.

Однако имейте в виду, что Start'ed Orchestration (s) фактически не будет активирован до тех пор, пока исходное сообщение не будет полностью дебатировано, потому что стартовые сообщения не фиксируются в MessageBox до завершения атомарной области.

person Johns-305    schedule 01.02.2014
comment
Как насчет использования компонента C # для запроса к SQL-серверу и создания массива сообщений (или списка) и их обработки? Я попробовал запущенное решение для оркестровки, и пока оно работает, поскольку оркестровки выполняются в разных потоках, данные возвращаются в другом порядке. Мне нужны вещи упорядоченным способом (в основном, информация о партии и деталях) - person SpaceCowboy74; 07.02.2014
comment
Хорошо, это немного ... ну, совсем другое;) Чтобы поддерживать порядок, вам нужно использовать Последовательный конвой во второй оркестровке. Для этого вы должны опубликовать дебатируемое сообщение с помощью формы отправки. Затем во второй оркестровке выберите сообщение, используя упорядоченный порт / форму приема в цикле. - person Johns-305; 08.02.2014
comment
Итак, то, что я в итоге сделал, было похоже на мое предыдущее предложение. Я создал сериализуемый список объектов сообщений (путем преобразования моих XSD в классы) и добавил сообщение к переменной, которая была моим объектом списка во время обсуждения. Затем я смог перебрать список за пределами атомарной области и сделать то, что мне нужно, с сообщениями, чтобы запросить серверы SQL. В целом производительность неплохая. Возможно, у меня относительно небольшие размеры сообщений. - person SpaceCowboy74; 21.02.2014