在现代企业架构中,企业服务总线(ESB)扮演着至关重要的角色,它提供了一种灵活、高效的方式来集成不同的应用程序和服务。本文将介绍如何使用ESB工具箱来实现一个简单的发布-订阅场景,并探讨使用ESB工具箱的优势和一些关键概念。
考虑一个场景,其中需要将联系人信息发布给多个订阅者。传统的解决方案是使用消息代理编排将多个消息放置在消息队列中,然后由发送端口订阅或其他编排根据定制的解决方案进行消费。本文将尝试使用ESB工具箱提出一种不同的解决方案。
自定义联系人消息不是规范形式,这是从应用程序收到的原始XML。需要使用转换映射将此消息转换为规范形式。
在这种情况下使用行程的优势是什么?可以在不修改现有BizTalk部署配置的情况下向行程中添加新的订阅者。可以使用BRE规则更改订阅者端点。可以使用BRE规则更改订阅者数据格式(映射)。
ESB入口接收消息。这是需要转换为规范形式的自定义联系人消息。
这个形状用于将自定义联系人消息转换为规范联系人。
这个形状用于使用编排处理规范联系人,并使用订阅者列表分发它。解析器列出了订阅者列表。
出口扩展器用于将规范消息归档到归档文件夹中。
BizTalk服务器动态发送端口,也称为ESB出口,用于将规范消息放入归档文件夹中。
转换映射是使用BRE解析器策略从行程形状解析器配置中定位的。BRE策略如下所示,注意映射的完全限定名。
BRE策略:ContactCanonicalMap
//##Conditions
If Context_Receive_Port_Name == "ContactInfo" and _
Context_Receive_Location_name == "ContextLocation:FILE"
//##Actions
Set Transform_Type To "MyCustomerSchema.CustomerContact_To_ContactCanonical_Map, _
MyCustomerSchema, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2710b190689828fa"
步骤1:消息队列绑定。需要一个逻辑接收端口,直接绑定到消息队列以接收ESB消息。规范联系人消息由编排接收。
步骤2:编写编排的核心。编排已分为两部分以便于理解。一部分用于解析器处理,另一部分用于推进行程。
Itinerary - Initialize
itineraryWrapper = new Microsoft.Practices.ESB.Itinerary.SerializableItineraryWrapper();
itineraryStepWrapper = new Microsoft.Practices.ESB.Itinerary.SerializableItineraryStepWrapper();
这是编排中最关键的部分。想法是遍历所有解析器,并将转换后的消息分配给动态发送端口。
Move to retrieve first resolver
resolver = resolvers.Current;
此操作将消息发送回行程以执行其他步骤。如果行程没有其他额外步骤,则不会执行此操作。
OutboundMsg.Body = InboundMsg.Body;
OutboundMsg(*) = InboundMsg(*);
itineraryWrapper.Itinerary.Advance(OutboundMsg, itineraryStepWrapper.ItineraryStep);
itineraryWrapper.Itinerary.Write(OutboundMsg);
在C:\Program Files (x86)\MicrosoftBizTalkESB Toolkit 2.1下定位esb.config,找到XML标签itineraryServices并添加以下内容:
<itineraryservice id="cbd59fc2-e8e0-4d00-ad73-8590938911b2" stage="None" scope="Orchestration" type="ContactOperation.Dispatcher, ContactOperation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2710b190689828fa" name="ContactOperation.Dispatcher"/>
使用Transform XLANG关键字:
Retrieve map type from resolution structure
mapCLRType = System.Type.GetType(mapType);
Executing a map using transform keyword
transform(OutboundMsg) = mapCLRType(InboundMsg);
使用'MapHelper.TransformMessage' API调用:
transformedData = Microsoft.Practices.ESB.Transform.MapHelper.TransformMessage(InboundMsg.Body.OuterXml, MetadataMsg.Body.TransformationType);
在行程中使用编排是不推荐的。行程的设计不鼓励在行程中使用编排。期待避免在行程中使用编排的更好解决方案的建议,针对本文介绍的场景。