在一个包含Dynamic Binding Send Port的Orchestration中,Send Port的地址是在流程中动态设定的。当把这样的Project部署成功后,我们在Admin上可以看到部署过程创建了一个物理Dynamic类型的Send Port,而且Orchestration会默认与它绑定。这个Dynamic Send Port的可设定属性包括Name, Pipeline。而其Transportation相关属性是在运行时被Orchstration Instance动态设定并实例化的。
通过Admin上的Query Subscription可以看到,它的Filter条件是OutboundTransportType,SPID,OutboundTransportLocation(AND)。通过Orchestration Port绑定关系,SPID属性可以被引擎获取。OutboundTransportType,OutboundTransportLocation属性通过Orchestration中的Send Port URI属性设置也可以获取。在运行时,这三个属性会被Promote。这样Orchestration发送的消息会被Dynamic Send Port正确订阅。
如果不使用Orchestration,该如何使用Dynamic Send Port实现动态地址的Send Port路由呢?
在Admin上,创建一个Dynamic One-Way Send Port。在Admin上Query Subscription上,可以查看到该Send Port的订阅条件(上一段已经描述),所不同的是它对Server上所安装的所有Adapter Type都做了订阅,不同类型之间是“OR“关系。显然SPID属性是系统创建的一个Guid值,具有随机性。把它作为订阅条件之一显然是不合适的。
如果在此Send Port Filter上添加一个新的订阅条件,如BTS.ReceivePortName="JacksonReceivePort"。重新查阅它的订阅条件,我们发现它的订阅条件变成了两个复合条件之间的"OR"操作。以FILE Adapter为例,其中的一个复合条件是:OutboundTransportType=="FILE" && OutboundTransportLocation Exists && BTS.ReceivePortName="JacksonReceivePort"。
定制开发一个Send Pipeline并应用于该Dynamic Send Port。这样就可以使用一个Send Port,而在Pipeline中动态设定传输地址了。
实例代码:
inmsg.Context.Write("OutboundTransportLocation", "http://schemas.microsoft.com/BizTalk/2003/system-properties", @"E:\temp\XLANGMessageDemo\out\%SourceFileName%");
inmsg.Context.Write("OutboundTransportType", "http://schemas.microsoft.com/BizTalk/2003/system-properties", "FILE");
PS:OutboundTransportLocation和OutboundTransportType属性是由Adapter Promote自动Promote。因此在正常情况下,这两个属性在Pipeline中读取出来时都是空字符串。
Original Post:http://blogs.digitaldeposit.net/saravana/post/2007/04/19/Can-you-use-Dynamic-Send-Port-without-Orchestration-Yes-you-can.aspx