Focus on biztalk -- chnking

心无旁骛,专注于biztalk......

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

 

可以使用biztalk提供的ExplorerOM名称空间下的APIbiztalk的各个组件进行管理,做Biztalk Administration Console做的那些管理任务,比如查看biztalk服务器上有多少个application,某个Application中有多少接收端口,有多少发送端口,增加删除Receive Location,增加删除发送端口等等。

BtsCatalogExplorerExplorerOM中的核心类,biztalk中的所有组件都通过BtsCatalogExplorer类对外暴露。

BtsCatalogExplorer的各种操作实际上是对biztalkBizTalkMgmtDb数据库的操作,因为biztalk的静态信息,包括这个biztalk服务上有什么Application,接收端口,发送端口,有什么适配器,handler等等都保存在BizTalkMgmtDb数据库。

如果要对biztalk中的某个组件进行操作,必须先初始化一个BtsCatalogExplorer对象,并将需要操作的那个biztalk服务器相应的BizTalkMgmtDb数据库的连接字符串赋给BtsCatalogExplorerConnectionString属性。

BtsCatalogExplorerbiztalk组件的修改都是在内存中进行,只有当执行到SaveChanges方法时,才会把所有的修改一次性提交到BizTalkMgmtDb数据库做实际的修改。

 

这里以实例说明使用ExplorerOM对象模型新建receive location过程。

 

代码下载:CreateReceiveLocation.rar

 

一、  新建File adapterReceive Location

用下面代码在“My Receive Port”接收端口下新建一个name为“Receive Location6 - Code Created user”的File类型的Receive Location

BtsCatalogExplorer root = new BtsCatalogExplorer();

try

{

    root.ConnectionString = "Data Source=.;Initial Catalog=BizTalkMgmtDb;Integrated Security=SSPI;";

   

    ReceivePort rp = root.ReceivePorts["My Receive Port"];

    ReceiveLocation rl = rp.AddNewReceiveLocation();

rl.Name = "Receive Location6 - Code Created user";

rl.Address = "c:\\temp\\te*.xml";

 

    foreach (ReceiveHandler handler in root.ReceiveHandlers)

    {

        if (handler.TransportType.Name == "FILE" && handler.Name == "BizTalkServerApplication")

        {

            rl.ReceiveHandler = handler;

            break;

        }

    }

    Microsoft.BizTalk.ExplorerOM.ProtocolType protocol = root.ProtocolTypes["FILE"];

    rl.TransportType = protocol;

 

rl.ReceivePipeline = root.Pipelines[typeof(PassThruReceive).FullName, typeof(PassThruReceive).Assembly.FullName];

 

string proStr = "<CustomProps><RemoveReceivedFileRetryCount vt=\"19\">51</RemoveReceivedFileRetryCount><RemoveReceivedFileMaxInterval vt=\"19\">300001</RemoveReceivedFileMaxInterval><FilePath vt=\"8\">F:\\temp</FilePath><FileMask vt=\"8\">pe*.xml</FileMask><Username vt=\"8\">a</Username><BatchSizeInBytes vt=\"19\">102401</BatchSizeInBytes><PollingInterval vt=\"19\">60001</PollingInterval><BatchSize vt=\"19\">21</BatchSize><Password vt=\"1\">a</Password><FileNetFailRetryInt vt=\"19\">51</FileNetFailRetryInt><RemoveReceivedFileDelay vt=\"19\">11</RemoveReceivedFileDelay><RenameReceivedFiles vt=\"11\">0</RenameReceivedFiles><FileNetFailRetryCount vt=\"19\">51</FileNetFailRetryCount></CustomProps>";

    rl.TransportTypeData = proStr;

 

    rl.FragmentMessages = Fragmentation.Yes;

    rl.ServiceWindowEnabled = false;

 

    rl.Enable = true;

 

    root.SaveChanges();

}

 

catch (Exception e)

{

    root.DiscardChanges();

    throw e;

}

 

需要注意的是,ReceiveLocationTransportTypeData属性。不同的适配器有不同的属性集,biztalk通过这个TransportTypeData属性接收这些不同的属性,属性的数据类型是string,实际上是name/value对组成的xml形式的属性集合。类似这样的形式,包括了File adapter所有的定制属性了:

                     

<CustomProps>

  <RemoveReceivedFileRetryCount vt="19">51</RemoveReceivedFileRetryCount>

  <RemoveReceivedFileMaxInterval vt="19">300001</RemoveReceivedFileMaxInterval>

  <FilePath vt="8">F:\temp</FilePath>

  <FileMask vt="8">te*.xml</FileMask>

  <Username vt="8">a</Username>

  <BatchSizeInBytes vt="19">102401</BatchSizeInBytes>

  <PollingInterval vt="19">60001</PollingInterval>

  <BatchSize vt="19">21</BatchSize>

  <Password vt="1" >password</Password>

  <FileNetFailRetryInt vt="19">51</FileNetFailRetryInt>

  <RemoveReceivedFileDelay vt="19">11</RemoveReceivedFileDelay>

  <RenameReceivedFiles vt="11">0</RenameReceivedFiles>

  <FileNetFailRetryCount vt="19">51</FileNetFailRetryCount>

</CustomProps>

 

ReceiveLocation.Address属性很重要,这个属性就是biztalk Administration ConsoleReceive Location列表中,Receive LocationURI属性,指示这个Location接收消息的位置,这个URI在一个biztalk server上所有Receive Location中必须唯一。

对于File适配器,ReceiveLocation.Address属性由File adaterFilePathFilemask属性组合而成。在新建FileReceive Location时,必须设置ReceiveLocation.Address,如果同时在TransportTypeData设置了FilePathFilemask属性,ReceiveLocation.Address会覆盖FilePathFilemask属性的设置,所以,没必要在TransportTypeData中设置FilePathFilemask属性。

 

 

一、  新建FTP adapterReceive Location

同样可以在代码中使用ExplorerOM新建一个使用FTP适配器的Receive Location,下面是代码,跟建立FileLocation稍有不同:

 

BtsCatalogExplorer root = new BtsCatalogExplorer();

try

{

    root.ConnectionString = "Data Source=.;Initial Catalog=BizTalkMgmtDb;Integrated Security=SSPI;";

    string proStr = "<Config xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><serverAddress>chnking1.com</serverAddress><serverPort>21</serverPort><userName>kent</userName><password /><fileMask>1*.xml</fileMask><targetFolder>testFolder1</targetFolder><representationType>binary</representationType><maximumBatchSize>0</maximumBatchSize><maximumNumberOfFiles>0</maximumNumberOfFiles><passiveMode>False</passiveMode><firewallType>NoFirewall</firewallType><firewallPort>21</firewallPort><pollingUnitOfMeasure>Seconds</pollingUnitOfMeasure><pollingInterval>60</pollingInterval><errorThreshold>10</errorThreshold><maxFileSize>100</maxFileSize><uri>ftp://chnking.com:21/testFolder/*.xml</uri></Config>";

    proStr = CreateLocationTransportData(proStr);

    ReceivePort rp = root.ReceivePorts["My Receive Port"];

    ReceiveLocation rl = rp.AddNewReceiveLocation();

    rl.Name = "Receive Location FTP - Code Created";

    rl.Address = "ftp://chnking.com:21/testFolder/t*.xml";

 

    foreach (ReceiveHandler handler in root.ReceiveHandlers)

    {

        if (handler.TransportType.Name == "FTP" && handler.Name == "BizTalkServerApplication")

        {

            rl.ReceiveHandler = handler;

            break;

        }

    }

    Microsoft.BizTalk.ExplorerOM.ProtocolType protocol = root.ProtocolTypes["FTP"];

    rl.TransportType = protocol;

 

    rl.ReceivePipeline = root.Pipelines[typeof(PassThruReceive).FullName, typeof(PassThruReceive).Assembly.FullName];

    rl.TransportTypeData = proStr;

 

    rl.FragmentMessages = Fragmentation.Yes;

    rl.ServiceWindowEnabled = false;

 

    rl.Enable = true;

 

    root.SaveChanges();

}

catch (Exception e)

{

    root.DiscardChanges();

    throw e;

}

 

FTP适配器具有的定制属性有下面这些:

<Config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <serverAddress>chnking.com</serverAddress>

  <serverPort>21</serverPort>

  <userName>kent</userName>

  <password />

  <fileMask>*.xml</fileMask>

  <targetFolder>testFolder</targetFolder>

  <representationType>binary</representationType>

  <maximumBatchSize>0</maximumBatchSize>

  <maximumNumberOfFiles>0</maximumNumberOfFiles>

  <passiveMode>False</passiveMode>

  <firewallType>NoFirewall</firewallType>

  <firewallPort>21</firewallPort>

  <pollingUnitOfMeasure>Seconds</pollingUnitOfMeasure>

  <pollingInterval>60</pollingInterval>

  <errorThreshold>10</errorThreshold>

  <maxFileSize>100</maxFileSize>

</Config>

 

但是跟File适配器不同,FTP适配器需要的TransportTypeData比较特别,需要下面的形式:

<CustomProps>

  <AdapterConfig vt="8">

    <!--定制配置属性的xml字符串形式-->

  </AdapterConfig>

</CustomProps>

 

需要把前面<Config>节部分的内容转成字符串格式,然后嵌入到<CustomProps><AdapterConfig>节点下,代码中proStr = CreateLocationTransportData(proStr);就是用来做这个转换的:

private static string CreateLocationTransportData(string configString)

{

    XmlDocument xd = new XmlDocument();

    XmlElement xeRoot = xd.CreateElement("CustomProps");

 

    xd.AppendChild(xeRoot);

    XmlElement xeConfig = xd.CreateElement("AdapterConfig");

    xeRoot.AppendChild(xeConfig);

    XmlAttribute xaVT = xd.CreateAttribute("vt");

    xeConfig.Attributes.Append(xaVT);

    xaVT.Value = "8";

 

    XmlDocument myXmlDocument = new XmlDocument();

    myXmlDocument.LoadXml(configString);

 

    xeConfig.InnerText = myXmlDocument.DocumentElement.OuterXml;

 

    return xd.InnerXml;

}

处理过的TransportTypeData数据是这样的:

<CustomProps>

  <AdapterConfig vt="8">&lt;Config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;&lt;serverAddress&gt;chnking1.com&lt;/serverAddress&gt;&lt;serverPort&gt;21&lt;/serverPort&gt;&lt;userName&gt;kent&lt;/userName&gt;&lt;password /&gt;&lt;fileMask&gt;1*.xml&lt;/fileMask&gt;&lt;targetFolder&gt;testFolder1&lt;/targetFolder&gt;&lt;representationType&gt;binary&lt;/representationType&gt;&lt;maximumBatchSize&gt;0&lt;/maximumBatchSize&gt;&lt;maximumNumberOfFiles&gt;0&lt;/maximumNumberOfFiles&gt;&lt;passiveMode&gt;False&lt;/passiveMode&gt;&lt;firewallType&gt;NoFirewall&lt;/firewallType&gt;&lt;firewallPort&gt;21&lt;/firewallPort&gt;&lt;pollingUnitOfMeasure&gt;Seconds&lt;/pollingUnitOfMeasure&gt;&lt;pollingInterval&gt;60&lt;/pollingInterval&gt;&lt;errorThreshold&gt;10&lt;/errorThreshold&gt;&lt;maxFileSize&gt;100&lt;/maxFileSize&gt;&lt;/Config&gt;

  </AdapterConfig>

</CustomProps>

 

对于FTP适配器,ReceiveLocation.Address属性由FTP adaterserverAddressserverPorttargetFolderfileMask属性组合而成,但是在新建FTP Receive Location的代码中ReceiveLocation.AddressTransportTypeDataserverAddress等属性也都需要设置,所以请保证两边设置的值是一致的。

posted on 2009-07-05 14:42  chnking  阅读(2081)  评论(0编辑  收藏  举报