Сегодня я расскажу о том, как разработать собственный адаптер для 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.