1

作为其工作过程的一部分,有几个应用程序系统相互传递消息。由于围绕事务完整性的技术限制,应用程序数据和消息传递都提交到单个大型机 DB2 数据库中。消息不直接传递到 BizTalk 服务器 (2006 R2);稍后由 BTS 从 DB2 数据库中提取消息。

DB2 数据库中的消息队列表有几个字段。关键字段是 MESSAGE_DATA 列 - 实际消息;它是 XML 内容本身。当使用 DB2 适配器从表中查询出记录时,传入的模式将类似于

更正更新:DB2Message 模式是基于属性的;我以前误认为它是基于元素的。

<DB2Message MESSAGE_DATA="&lt;InternalXML&gt; ........ &lt;/InternalXML&gt;"
 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>
4

2 回答 2

1

克里斯是正确的——看起来它只是你真正关心的信息的内部部分,外部部分只是一个信封。

因此,我建议您创建一个反汇编程序,该程序在接收管道中将剥离信封(如果您需要采取行动,您可以将其作为上下文属性保持完整和/或从中提取一些位作为单独的属性上),并提取将成为发布到消息框的消息的内部部分。

现在真正的消息是得到处理的消息,但发送端口的其余部分和任何订阅者,以及您从信封中需要的任何信息都会通过它的上下文流动。

现在您可以完全访问消息及其属性;如果适用,您可以为此消息部署一个模式,该模式可能具有可区分的属性,可以让您快速访问某些(简单类型)节点。或者,您可以使用 xlang/s xpath 来提取信息。

如果您的嵌入消息在信封中的一个元素内,您当然可以使用内置的 XmlDisassembler 来完成所有这些工作(您只需要正确部署您的模式并相应地配置组件;我不确定这有多好用包含在属性中的消息,但可能值得一试。

最坏的情况是,您正在考虑编写一个自定义反汇编程序,该反汇编程序会剥离信封,然后调用内置反汇编程序来处理内部消息,但这也不应该花费太多精力。

于 2008-12-06T14:20:55.537 回答
0

I would suggest looking into envelope schemas to 'unwrap' the interior message from the outer message. I believe the envelope can promote properties from the envelope into the inner message's context as it moves through the receive pipeline. The inner message will then have to map to a schema of its own type. You will then be able to route or make decisions based on the schema type and use XPath to pick out whatever you need. Have not tried all of these things, but I am certain the functionality exists to do do this.

于 2008-12-05T04:15:11.003 回答