代码之家  ›  专栏  ›  技术社区  ›  icelava

提取内部架构XML值以映射到业务流程的入站架构的方法

  •  1
  • icelava  · 技术社区  · 16 年前

    有几个应用程序系统在工作过程中相互传递消息。由于涉及事务完整性的技术限制,应用程序数据和消息传递都提交到一个大型机db2数据库中。这些消息不会直接传递到biztalk服务器(2006 r2);稍后由bts从db2数据库中提取消息。

    db2数据库中的消息队列表有几个字段。关键字段是消息数据列-实际的消息;它是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>
    

    业务流程将使用报头中的几个提升字段来制定路由和处理决策。问题是,这些头字段实际上来自存储在db2message的消息数据中的内部xml内容。

    在这个单一级别上,映射器在将这两个模式放在一起时,不知道消息数据中的这个未使用xml模式。可能有一些xpath functoid可以进一步深入到messaget_数据元素以执行正确的值映射,但是由于以前没有处理过大量的xml和xslt应用程序,我无法看到可以帮助我执行此任务的可用功能。

    以前有人做过这样的数据提取和映射吗?

    更新。根据请求,消息中的数据内部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>
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Yossi Dahan    16 年前

    克里斯是对的——这似乎只是你真正关心的信息的内部,外部只是一个信封。

    因此,我建议您创建一个反汇编程序,在接收管道中,该反汇编程序将去掉信封(如果需要对信封进行操作,您可以将其作为上下文属性整体保存和/或从中提取一些位作为单独属性),并提取将成为将消息发布到消息框中。

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

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

    如果嵌入的消息位于信封中的元素中,那么您当然可以使用内置的xml反汇编程序来完成所有这些操作(您只需要正确部署模式并相应地配置组件;我不确定这对于包含在at致敬,但这可能值得一试。

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

        2
  •  0
  •   Christian Loris    16 年前

    我建议研究信封模式,从外部消息“解开”内部消息。我相信信封可以在通过接收管道时将属性从信封提升到内部消息的上下文中。然后,内部消息必须映射到其自身类型的架构。然后,您将能够根据模式类型路由或做出决策,并使用xpath来选择所需的内容。没有尝试过所有这些事情,但我确信存在这样做的功能。

    推荐文章