2008-11-01 65 views
1

作爲其工作過程的一部分,有幾個應用程序系統將消息傳遞給對方。由於技術上的約束使得事務完整性得到了控制,所以應用程序數據和消息傳遞都被提交到一個大型機DB2數據庫中。郵件不直接傳遞給BizTalk服務器(2006 R2); BTS需要稍後將消息從DB2數據庫中提取出來。提取內部模式XML值以映射到編排的入站模式的方法

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> 

業務流程將使用多個推廣領域的頭,使路由和處理決定的模式。問題是,這些頭字段實際上來自存儲在DB2Message的MESSAGE_DATA中的內部XML內容。

在這個單一級別上,Mapper在將兩個模式組合在一起時並不知道MESSAGE_DATA中的這個解構XML模式。應該可能有一些XPath functoid可以進一步鑽取MESSAGET_DATA元素以進行適當的值映射,但之前沒有處理過大量的XML和XSLT應用程序,但我無法看到可幫助我執行此任務的可用功能。

以前有人做過這樣的數據提取和映射嗎?

UPDATE。按照要求,在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> 
+0

將DB2查詢模式更新爲基於屬性而不是基於元素。 – icelava 2008-11-05 02:27:48

回答

0

我會建議尋找到信封模式來「解包」從外部消息的內部消息。我相信信封可以通過接收管道將信封中的屬性提升到內部信息的上下文中。內部消息將不得不映射到它自己類型的模式。然後,您將能夠根據模式類型進行路由或做出決策,並使用XPath挑選出您需要的任何內容。還沒有嘗試所有這些東西,但我確定功能存在這樣做。

1

克里斯是正確的 - 它似乎只是你實際關心的信息的內在部分,外部只是一個信封。因此,我建議你創建一個反彙編程序,它在接收管道中將去除信封(可以將它作爲上下文屬性保存,並/或從中提取一些位作爲單獨的屬性,如果你需要對他們採取行動),並提取內部部分,這將成爲消息框中發佈的消息。

現在,真正的消息是一個得​​到處理的消息,但發送端口和任何訂戶的其餘部分,以及您從信封中需要的任何信息都會通過它的上下文流入。

現在您可以完全訪問郵件及其屬性;如果適用,您可以爲此消息部署一個模式,該模式可能具有可以讓您快速訪問某些(簡單類型)節點的區分屬性。或者,您可以使用xlang/s xpath來提取信息。

如果您的嵌入式消息位於信封中的某個元素內,您當然可以使用內置的XmlDisassembler來完成所有這些操作(您只需正確部署模式並相應地配置組件;我不知道如何好吧,這可以與一個屬性中包含的消息一起工作,但它可能是值得一試的

最糟糕的情況下,你正在看編寫一個自定義反彙編程序,將剝離信封,然後調用內置的反彙編程序來處理內部消息,但這也不應該太過努力。