作为其工作过程的一部分,有几个应用程序系统相互传递消息。由于围绕事务完整性的技术限制,应用程序数据和消息传递都提交到单个大型机 DB2 数据库中。消息不直接传递到 BizTalk 服务器 (2006 R2);稍后由 BTS 从 DB2 数据库中提取消息。
DB2 数据库中的消息队列表有几个字段。关键字段是 MESSAGE_DATA 列 - 实际消息;它是 XML 内容本身。当使用 DB2 适配器从表中查询出记录时,传入的模式将类似于
更正更新:DB2Message 模式是基于属性的;我以前误认为它是基于元素的。
<DB2Message MESSAGE_DATA="<InternalXML> ........ </InternalXML>"
MESSAGE_DATE="2008-1-1 00:00:00" MESSAGE_ID="GUID" TXN_ID="GUID" .... other attrib />
编排使用模式
<EAIMessage>
<Header>
<ServiceID>
<MessageID>
....
<Mode>
</Header>
<Body>
<RawXML>
</Body>
</EAIMessage>
编排将使用 Header 中的几个提升字段来做出路由和处理决策。问题是,这些标题字段实际上来自存储在 DB2Message 的 MESSAGE_DATA 中的内部 XML 内容。
在这个单一级别上,当将两个模式放在一起时,映射器不知道 MESSAGE_DATA 中的这个底层 XML 模式。可能应该有一些 XPath functoid 可以进一步深入 MESSAGET_DATA 元素以进行正确的值映射,但之前没有处理过广泛的 XML 和 XSLT 应用程序,我无法看到可以帮助我执行此任务的可用功能.
有没有人做过这样的数据提取和映射?
更新。根据要求,在 MESSAGE_DATA 内部 XML 中可能看起来像
<Message>
<Id>e86970f4-0455-4535-8e65-a06eb7aaef8a</Id>
<SenderApp>999</SenderApp>
<ReceiverApp>2000</ReceiverApp>
<ServiceId>8798973454</ServiceId>
<Mode>P</Mode>
<MuxId></MuxId>
<ExceptionCode></ExceptionCode>
<ExceptionMessage></ExceptionMessage>
<Body>
<WorkItem xmlns="http://tempuri.org/WorkItem.xsd">
<ServiceHeader xmlns="http://tempuri.org/Service.xsd">
<ID_UPDATED_BY>username</ID_UPDATED_BY>
<ID_HISTORY_REF>xxxxxxx</ID_HISTORY_REF>
<SESSION_ID>sessionID</SESSION_ID>
<DT_LAST_UPDATE>timestamp</DT_LAST_UPDATE>
<TM_LAST_UPDATE>time</TM_LAST_UPDATE>
</ServiceHeader>
</WorkItem>
</Body>
</Message>