Debatching(Splitting) XML Message in Orchestration using DefaultPipeline - BizTalk 2010
2015-08-23 00:19
1061 查看
Debatching(Splitting) XML Message in Orchestration using DefaultPipeline - BizTalk 2010
In this post we will walk through the process of debatching an xml message in Orchestration using pipeline in Biztalk.I have used the Default XML Receive pipeline to achieve it, but it can also be done by creating a custom pipeline which uses XML disassembler (where you can set the Envelope and Document Schema).
Pipeline is not available in Orchestration like other shapes, thus to use it we need to add reference to following assemblies(which will allow us to use methods in those assemblies) :
Microsoft.XLANGs.Pipeline.dll
Microsoft.BizTalk.Pipeline.dll
You can browse to the location BizTalk Installation Directory to find above dll's.
Most of the part of this post is borrowed from my earlier post which talks about debatching xml at receive port:
http://tech-findings.blogspot.in/2013/07/debatchingsplitting-xml-message-biztalk.html
Scenario:
We receive many item information but its wrapped (Enveloped) , so to process each item we need to unwrap it (remove the envelope and split individual Item message).Below is what we receive (Input) :
<ns0:Items xmlns:ns0="http://TestingSchemas.ItemEnvelope">
<ns1:Product xmlns:ns1="http://TestingSchemas.Item">
<ID>ID_0</ID>
<Name>Name_0</Name>
<Quantity>100</Quantity>
<UnitPrice>100</UnitPrice>
</ns1:Product>
<ns1:Product xmlns:ns1="http://TestingSchemas.Item">
<ID>ID_0</ID>
<Name>Name_1</Name>
<Quantity>200</Quantity>
<UnitPrice>100</UnitPrice>
</ns1:Product>
<ns1:Product xmlns:ns1="http://TestingSchemas.Item">
<ID>ID_2</ID>
<Name>Name_2</Name>
<Quantity>300</Quantity>
<UnitPrice>100</UnitPrice>
</ns1:Product>
<ns1:Product xmlns:ns1="http://TestingSchemas.Item">
<ID>ID_3</ID>
<Name>Name_2</Name>
<Quantity>300</Quantity>
<UnitPrice>100</UnitPrice>
</ns1:Product>
<ns1:Product xmlns:ns1="http://TestingSchemas.Item">
<ID>ID_4</ID>
<Name>Name_2</Name>
<Quantity>300</Quantity>
<UnitPrice>100</UnitPrice>
</ns1:Product>
<ns1:Product xmlns:ns1="http://TestingSchemas.Item">
<ID>ID_5</ID>
<Name>Name_2</Name>
<Quantity>300</Quantity>
<UnitPrice>100</UnitPrice>
</ns1:Product>
<ns1:Product xmlns:ns1="http://TestingSchemas.Item">
<ID>ID_6</ID>
<Name>Name_2</Name>
<Quantity>300</Quantity>
<UnitPrice>100</UnitPrice>
</ns1:Product>
<ns1:Product xmlns:ns1="http://TestingSchemas.Item">
<ID>ID_7</ID>
<Name>Name_2</Name>
<Quantity>300</Quantity>
<UnitPrice>100</UnitPrice>
</ns1:Product>
<ns1:Product xmlns:ns1="http://TestingSchemas.Item">
<ID>ID_8</ID>
<Name>Name_2</Name>
<Quantity>300</Quantity>
<UnitPrice>100</UnitPrice>
</ns1:Product>
<ns1:Product xmlns:ns1="http://TestingSchemas.Item">
<ID>ID_9</ID>
<Name>Name_2</Name>
<Quantity>300</Quantity>
<UnitPrice>100</UnitPrice>
</ns1:Product>
</ns0:Items>
But we want (Output) :
<ns0:Product xmlns:ns0="http://TestingSchemas.Item">
<ID>ID_0</ID>
<Name>Name_0</Name>
<Quantity>100</Quantity>
<UnitPrice>100</UnitPrice>
</ns0:Product>
.
.
.
.
.
<ns0:Product xmlns:ns0="http://TestingSchemas.Item">
<ID>ID_9</ID>
<Name>Name_9</Name>
<Quantity>100</Quantity>
<UnitPrice>100</UnitPrice>
</ns0:Product>
All right, let's see how we do it:
1. Create schema - document schema
2. Create the wrapper - Envelope Schema
Name the root node, I have named it Items.
Click on "Schema" and go to Properties Window
Set the property "Envelope" as Yes, as this schema will be used as envelope and this is the property which helps disassembler to recognize it.
So far good, envelope schema is ready but what about the document which will be wrapped.
In the Property window select "Imports" and click on the ellipsis
You will get Imports wizard pop-ed out .
Click on add and select the document schema which we created in step 1.(Here it is Item schema)
Click on the "Items" and go to property window and select the property Body XPath and set it to/*[local-name()='Items' and namespace-uri()='http://TestingSchemas.ItemEnvelope']. Doing so allows an Items node to contain any number of Item Document.
Cool... Now we are ready with the resources, next is to validate schema, build it, sign it and deploy.
3. Now lets create Orchestration which will receive the enveloped item and debatch/split it using the pipeline.
Receive shape is configured to receive untyped message i.e. of type System.Xml.XmlDocument (which will receive enveloped message -ItemEnvelope Type) .
Then we have a "DebatchScope" which is of type "Atomic" and Orchestration is of type Long running. Why Atomic scope? Because we will be calling/executing Pipeline within it and the pipeline is of non- serializable type.
Next we have Expression shape named as "Execute Pipeline". It is here where we make call to pipeline and execute it which results in splitted messages.
It contains following line: GetPipelineOutput=Microsoft.XLANGs.Pipeline.XLANGPipelineManager.ExecuteReceivePipeline(typeof(Microsoft.BizTalk.DefaultPipelines.XMLReceive),ItemsIn);
GetPipelineOutput is a DebatchScope variable of type: Microsoft.XLANGS.Pipeline.ReceivePipelineOutputMessages
So we are executing the method ExecuteReceivePipeline() method of XLANGPipelineManager class which belongs to Microsoft.XLANGs.Pipeline and its output assigned to GetPipelineOutput.
Then we have a loop shape "UntilLastMessage" and its same as while loop, below is the condition(tillspillited messages are available) : GetPipelineOutput.MoveNext()
Next is Construct shape with Message Assignment within it, which has following code:
ItemOut = null;
GetPipelineOutput.GetCurrent(ItemOut);
It is here where the splitted single message is assigned to ItemOut , where ItemOut is a Message variable which is of type Item.xsd
At last we have Send shape which accepts message of type ItemOut and sends it .
Now what, build the project , sign it and deploy .
4.Now create a Receive and Send port :
Receive Pipeline is PassThruReceive as we don't want its message type to be detected until the message reaches to ExecutePipeline shape in Orchestration.
Now after both the ports are ready, it's time to bind it to the logical ports of our orchestration:
5. Start the application and test it, I will drop a envelope message at receive location which we saw at start . So I should be getting 10 individual xml message at the destination location:
Will keep on posting as an when I find something to share!!!!!!!!!!!!
相关文章推荐
- zendframework配置流程
- 解决Mysql报错:PHP Warning: mysql_connect(): mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication.
- 如何理解ContentProvider?(通讯录)
- phpBB安装
- php 魔术方法 __call
- php 分页操作(三)
- PHP PDO 安全执行 set names utf8 的正确方法
- (3.1.2.1)getParameter()和getAttribute()
- php var_export与var_dump的区别
- MAC 系统升级10.10以后PHP验证码错误的解决办法。[ 一行代码轻松解决! ]
- php 分页操作(二)
- ubuntu 14.04 安装配置php7
- php 分页操作(一)
- Dsicuz x2.5去掉域名后面的/forum.php
- 如何用PHP通过拼接数据到显示在数据库图表上
- 关于php析构函数的一个有趣问题
- VTP(链路聚集协议)
- 利用PHPExcel将数据库数据导入excel表格的方法
- win7 访问ftp站点 不用浏览器显示
- php uploadify上传图片时url出现%EF%BB%BF