BizTalk and around

Stas Kondratyev (MSFT)

Разработка транзакционных адаптеров для BizTalk с помощью WCF LOB Adapter SDK

Сегодня я расскажу о том, как разработать собственный адаптер для BizTalk с помощью WCF LOB Adapter SDK  и сделать его транзакционным.

Перед началом разработки адаптера нужно убедиться, что у вас уже установлено:

·         BizTalk Server 2006 R2

·         Visual Studio 2005 SP1

·         .NET Framework 3.0

·         WCF LOB Adapter SDK 1.1

 

После этого, открыв Visual Studio 2005, вы увидите в списке шаблонов проектов WCF LOB Adapter.

Можно попробовать сразу начать писать адаптер с нуля, используя шаблон, но если нет опыта, рекомендую выполнить пошаговый пример разработки эхо-адаптера. Если времени совсем нет, можно посмотреть исходный код готового эхо-адаптера, он поставляется вместе с  WCF LOB Adapter SDK. Его можно найти тут: C:\Program Files\WCF LOB Adapter SDK\Documents\Samples.  Кстати в состав готового эхо-адаптера так же входит проект для сборки установочного msi пакета, позволяющий автоматизировано развертывать адаптер на других компьютерах.

Как мы уже писали ранее, большой плюс WCF адаптеров в том, что их можно вызывать не только из BizTalk, но и из любого  .NET приложения. Во втором примере как раз демонстрируется, как это сделать.

Поддержка транзакций

После того как мы научились создавать WCF адаптер, можем усложнить задачу и сделать его транзакционным. Зачем это нужно. Например, если вы хотите быть уверены  в том, что данные не удаляться из источника пока они не попадут в надежное хранилище, например BizTalk Message Box. Для этого нужно чтобы запись в Message Box и удаление уже считанных данных из источника производилось в одной транзакции. Сначала это может показаться сложной задачей, ведь прежде чем попасть в Message Box сообщение может проходить сложную обработку в receive pipeline, используя большое кол-во компонентов. Сразу возникает много вопросов, как создать транзакцию, как заставить BizTalk использовать эту же транзакцию при записи сообщения в Message Box, кто всем этим процессом будет управлять? Ответ прост, практически всю работу по созданию и управлению транзакцией берёт на себя WCF LOB Adapter Framework, нужно только указать, что мы хотим использовать транзакции.  

Для исходящих (outbound) операций, транзакция создается автоматически. То есть метод  Execute в IOutboundHandler,  будет выполняться внутри TransactionScope, созданного WCF LOB Adapter Framework и если проверить значение переменной Transaction.Current,  то мы увидим, что оно не null.

Для входящих (inbound) операций включить транзакции немного сложнее, существует 2 способа, для одностороннего (oneway) типа канала и канала запрос-ответ (request-reply). Реализовать 1й намного проще, начнем с него.

Односторонний (OneWay):

1.       В конструкторе вашего адаптера установите  свойство SupportsTransactedInbound в true

2.       В методе CreateBindingElements  вашего Binding класса, добавьте в начало коллекции BindingElements элемент  OneWayBindingElement.  Обратите внимание, что его нужно добавлять только во время работы адаптера, то есть в случаях когда адаптер выполняет выгрузку метаданных этот элемент добавлять нельзя. Для этой цели можно добавить к списку свойств адаптера дополнительную булевою переменную. Её мы будем устанавливать только когда адптер выполняется, например, когда настраиваем параметры адаптера в свойствах BizTalk Receive location.

3.       После этого WCF будет самостоятельно создавать транзакцию и вызывать ваш метод TryReceive внутри неё. Так же он самостоятельно выполнит фиксацию транзакции после того как ваше сообщение попадет в MessageBox. Если же при обработке сообщения в pipeline произойдет исключение, то выполниться откат транзакции.

Примечание: В BizTalk нужно создать OneWay receive порт.

Запрос-ответ (Request-Reply):

1.       В конструкторе вашего адаптера установите  свойство SupportsTransactedInbound в false

2.       В методе TryReceive создайте транзакцию самостоятельно.

3.       Присвойте сообщению созданную транзакцию с помощью TransactionMessageProperty.Set

4.       В методе Reply вашей реализации IInboundReply зафиксируйте транзакцию.

Примечание: В BizTalk нужно создать Request-Reply receive порт.

Поддержка транзакций источником данных

Если ваш источник данных транзакционный и его SDK умеет работать с механизмом транзакций .NET, то вам, скорее всего, ничего не придется делать. Например, Oracle провайдер ODP.NET такую поддержку имеет, и если открыть соединение внутри .NET транзакции (TransactionScope) то все операции с базой данных Oracle будут выполняться в этой транзакции.

Заключение

Если вы всё сделали правильно, то вы получили WCF адаптер, который вы можете использовать в своих решениях построенных на BizTalk Server или в любых других .NET приложениях.

P.S. В следующей версии WCF LOB Adapter SDK реализация односторонних операций станет ещё проще, достаточно будет установить одно свойство. О выходе новой версии мы обязательно сообщим, так что заходите на наш блог почаще, либо получайте обновления автоматически через RSS.

Published Tuesday, November 18, 2008 8:57 AM by yaroslav
Filed under: , ,

Comments

 

BizTalk and around said:

Продолжая предыдущий пост , поделюсь опытом разработки транзакционного WCF адаптера для очередей Oracle

November 20, 2008 6:06 AM
Anonymous comments are disabled

© 2009 Microsoft Corporation. All rights reserved. Terms of Use  |  Trademarks  |  Privacy Statement
Microsoft
Page view tracker