[Develop]Biztalk管線 Pipeline -2/3
Lab3 、 初探管線 |
在工作實務上,系統與系統間的整合需求越來越多。倘若系統都在你們公司自己家裡,那問題可能會比較好去解決一點點。很多時候 你往往被賦予與外部合作夥伴有資訊系統整合的工作,這時候你很難去掌握甚至去要求對方的資訊基礎建設的程度,往往一切就是付諸 於祈禱吧。運氣好一點在資料交換上會有很理想的檔案格式、也可以考慮到資訊安全基礎建設…等等。運氣不好一點,你可能無法預期 對方會給你什麼樣的一個檔案 ? 並且用什麼樣的一個方式給你 ? 然後有要求你要給他什麼樣的一個檔案 ? 並且怎麼給他 ? 你實在只能靠 祈禱。常常很希望我們聽到的是 XML、Web Service…..。但是好像比較常聽到的是, txt 、寄Mail 、 FTP Excel…..><||||||||||| 。 狀況假設: 這個範例中,架設你是一個書籍的批發商,有下游的書店傳了一份書籍的訂單給你。而你收到這份訂單之後,也會回傳一份回覆的檔案給書商。這部分我們先不把書商是用什麼樣的協定 模式將檔案傳給你的,也不討論你要怎麼把檔案給他。因為加入這個課題,那就會更複雜這個 Lab。所以我們就將他拆解,這章節先來強調怎麼樣轉換檔案內容。先前我們討論過,由於 你很難掌握你的夥伴會給你怎麼樣的一份檔案並且要求你又給他怎麼樣的一份檔案。所以在這個章節,我們來用最基本的文字檔作為練習。因為很多時候,這個也是我們蠻常會碰到的 文件格式。接者我們條列一下這個範例的步驟 1. 建立新的空白專案 。 2. 替專案加入強式金鑰 。 3. 新增書商訂單檔案結構。 4. 新增批發商訂單回覆檔案結構。 5. 新增管線 。 6. 建置與部署。 7. 新增實體接收位置。 8. 新增實體傳送位置。 9. 測試。 這份是我們要接收的訂單樣本!! 這是要傳送出去的回覆訊息樣本!! |
新增空白Biztalk
Server 專案。
在Biztalk Server 專案中選擇用滑鼠右鍵選擇 [ 加入新項目 ]。可以看到下列視窗。在左邊 [ 對應檔 ] 裡面可以看到 [
對應 ]的選項,這
個元件是用在Biztalk 理面資料對應轉換的強大工具。
在專案上我們按下右鍵屬性去加入一個強式的金鑰。
加入接收的檔案結構描述
無論對方會給我們什麼格式的檔案,要在 Biztalk 中處理這份訊息,還是要替它定義一個文件的結構描述。這邊我們在專案中新增
一個新項目, [ 結構描述 ],檔案名稱我們命名為 [ Lab3_TxtFileIn.xsd ]。
我們將 [ 根元素 ] 改名為 [ OrderRequest ] 。
然後在 [ OrderRequest ] 節點上插入 [ 子記錄 ] ,新增 [ Master ] 與 [ Detail ] 兩個紀錄。
接著下來分別在 [ Master ] 與 [ Detail ]兩個節點上新增 [ 子項目欄位 ]。
在 [ Master ] 項目下 新增 [ StoreName ] 、 [ StoreAddress ] 、 [ StorePhone ]
、 [ StoreSerial ] 、 [ OrderDate] 。
在 [ Detail ] 項目下 新增 [ SerialNo ] 、 [ BookName] 、 [ Author ] 、 [ publisher
] 、 [ amount ]。
這部份是根據你會收到的檔案結構來設計。
接者我們在這個 [ Lab3_TxtFileIn.xsd ] 的檔案結構描述上的 [ Schema ] 的屬性部分, 在 [ Schema
Editor Extnsions ] 中選擇
[ Flat File Extension ] 支援一般檔案。
接著在 [ OrderReqest ] 根元素的屬性中,設定 [ Flat File ] 區域下的三個屬性。
接著在 [ Master ] 元素的屬性中,設定 [ Flat File ] 區域下的三個屬性。
Child Delimiter : , <– 因為對方來的文件的單頭部份會用 [ , ] 來做區隔。實務上就是看妳的合作對象送來的文件是如何了!
Child Delomiter Type : Character .
Child Order : Infix .
在一般的區域中設定 [ Max Occurs ] 跟 [ Min Occurs ]。
Max Occurs 跟 Min Occurs : 都設定為 1 ,代表這個標頭的部分最多只能出現一次;最少也只能出現一次。
在 [ Detail ] 元素的屬性中,設定 [ Flat File ] 區域下的三個屬性。
Child Delimiter : | <– 因為對方來的文件的單身部份會用 [ | ]。! 早期很多規格標準也是使用 [ | ]
來做資料的區隔,像 HL7 在 2.4 以前的版本就是以文字
檔案來描述資料,並且用 [ | ] 來區隔資料。
Child Delomiter Type : Character .
Child Order : Infix .
在一般的區域中設定 [ Max Occurs ] 跟 [ Min Occurs ]。
Min Occurs 設定為 1 ,代表這個單身的部分最少要出現一次。
Min Occurs 設定為 [Unbounded] ( 你可以直接打 * 也可以 ),代表這個單身的最多出現的次數沒有限制。
產出執行個體
設定好了 XSD 的檔案結構時,我們可以在檔案結構上用滑鼠右鍵選到屬性頁 ,裡面可以設定[ 輸出執行個體檔案名稱 ] 來設定當你用 [產出執行個體]
的功能時檔案的位置 ! 這個功能是幹麻用呢?? 主要就是可以讓你產出一份參考檔案,看下方右圖,這是一份依據你的結構描述產出的文字檔
。這份檔案就可以讓你拿來跟供應商溝通文件格式使用,還蠻方便的吧!!
加入要傳送的檔案結構描述
再來我們加入一個新的項目,也是 [ 結構描述 ],這是一份你將會傳給對方的文件描述。這裡我們命名為 [ Lab3_TxtFileOut.xsd
] 。
我們將 根元素重新命名為 [ OrderResponse ] 。然後一樣新增兩個 [ 子記錄 ] 。[ Master ] 跟 [ Detail
],
接著下來分別在 [ Master ] 與 [ Detail ]兩個節點上新增 [ 子項目欄位 ]。
在 [ Master ] 項目下 新增 [ Wholesaler ] 、 [ Wholesaler Address ] 、 [ WholesalerPhone
] 、 [ PriceCount ] 。
在 [ Detail ] 項目下 新增 [ SerialNo ] 、 [ OrderProduct ] 、 [ ShipDate ] 、
[ Price ] 、 [ Amount ]。
這是一份你要傳送給人家的結果的檔案。
接者我們在這個 [ Lab3_TxtFileOut.xsd ] 的檔案結構描述上的 [ Schema ] 的屬性部分, 在 [ Schema
Editor Extnsions ] 中選擇
[ Flat File Extension ] 支援一般檔案。
接著在 [ OrderReqest ] 根元素的屬性中,設定 [ Flat File ] 區域下的三個屬性。
接著在 [ Master ] 元素的屬性中,設定 [ Flat File ] 區域下的三個屬性。
Child Delimiter : , <– 我們定義我們傳送回去的文件的單頭部份會用 [ , ] 來做區隔。
Child Delomiter Type : Character .
Child Order : Infix .
在一般的區域中設定 [ Max Occurs ] 跟 [ Min Occurs ]。
Max Occurs 跟 Min Occurs : 都設定為 1 ,代表這個標頭的部分最多只能出現一次;最少也只能出現一次。
在 [ Detail ] 元素的屬性中,設定 [ Flat File ] 區域下的三個屬性。
Child Delimiter : | <– 我們傳回去的文件的單身部份會用 [ | ] 來區隔資料。
Child Delomiter Type : Character .
Child Order : Infix .
在一般的區域中設定 [ Max Occurs ] 跟 [ Min Occurs ]。
Min Occurs 設定為 1 ,代表這個單身的部分最少要出現一次。
Min Occurs 設定為 [Unbounded] ( 你可以直接打 * 也可以 ),代表這個單身的最多出現的次數沒有限制。
加入檔案對應
我們來加入一個對應的項目,這邊就是要將你收到的檔案轉換成你要給人家的檔案。
在對應的檔案左邊選擇 [ Lab3_TxtFileIn.xsd ] 檔案結構 ;右邊我們選擇 [ Lab3_TxtFileOut.xsd
]。
然後拉出下列圖形。這個範例我們也未了不要複雜化他,所以大量使用字串串連的元件。,。,。,。,。,。,。,。,。,。,。,。,。,。,。
第一個圖型沒有跟來源檔案結構連連接,它拉了一條線接到目的地檔案結構上的 [ Wholesaler ]。我們在這邊假設這回傳的部份要回傳批發商的名稱。在這我們輸入"QQ電腦叢書批發商"
。這部份因為我們簡化他,所以用字串串連元件。一般實務上你可能會搭配你們公司的ERP或是資料庫,撈取你們公司統一的抬頭。但我們也先不要再把資料庫加進來複雜化照這個Lab。
第二個圖形連接到 [ WholesalerAddress ],顧名思義,我們要在回覆訂單上回覆批發商的地址。按下[ 插入新參數後 ],在文字框裡面輸入"這是地址"。
第三個圖形連接到 [ WholesalerPhone ],我們要在回覆訂單上回覆批發商的聯絡電話。按下[ 插入新參數後 ],在文字框裡面輸入
"(02)8825252"。
第四個圖形連接到 [ OrderProduct ],我們將書店傳來的訂單上的 [ Bookname ]、[ Author ]、[publisher]
三個欄位中間再加上 [ _ ]串成一個訊息然後送給[ OrderProduct ] 屬性。類似給書店確認
訂購的產品用的。 例如書商傳來一份 [ Biztalk 2006 R2 ] 、[ 作者王小明]、[ AA出版社 ],我們要將訊息串成 [
Biztalk 2006 R2_作者王小明_ AA出版社 ]。回傳給書商作確認。這只是我們
假想的例子啦,真實狀況一定不會是這樣。
在設定運算值輸入的部份,有三段 Xpath 語法是我們將線拉到字串連接圖形上它會自動幫我們產生的。因為我們要在三個訊息中間加上 [ _ ]
底線,所以我們要自己新增兩個參數。按下
[ 插入新參數後 ],在文字框裡面輸入 [ _ ] 底線。
再來的日期圖形什麼參數都不用加,元件會自動幫我們設定目前的日期。回覆每種書的交貨日期,在這邊我們就先簡化它。實際上可能一次的訂單,不是所有東西都可以一起出貨的!
可能會有缺貨的問題。
這個圖形連接到 [ Price ],是批發商要回覆每本書的價錢,實務上每本書的價錢一定都不一樣,這邊可以搭配你的紀錄書籍價錢的資料庫來做設計。這邊我們假設每種書都賣300元。
按下[ 插入新參數後 ],在文字框裡面輸入 "300"。
接著我們希望回覆的訊息能幫我們計算這次訂貨的總金額,我們在左邊來源資料結構上的 [ amount ] 拉一條線連接到 數學符號的[ 乘法:
X ];點兩下 [ 乘法 ]它會告訴你這個兩個值才可以
運算。我們在幫他新增一個值,按下[ 插入新參數後 ],在文字框裡面輸入 "300"。這樣他就會自動去算你訂購的這本書有幾本
X 每本300元。然後再來我們計算的結果加總起來。並且
把它指向 [ PriceCount ],這時你只要再拉出一個累積運算值裡面的累積總和( 就是我們以前學數學的"系克馬"
),這樣 Biztalk 就會自動幫你加總計算結果了。
加入接收管線
這邊我們再來新增一個項目,[ 接收管線 ] ;我們命名為 [ ReceivePipeline.btp ]。
在管線編輯視窗中,我們從左邊拉一個 [ 一般檔案解譯器 ] 到管線的 [ 解譯 ] 區塊,然後在屬性視窗的 [ 管線元件屬性 ]中的文件描述選擇
[ Lab3_Pipeline.Lab3_TxtFileIn ]。表示這個管線
會負責在接受檔案後進行解譯的動作,並且將 Txt 的檔案解譯成我們新增的 XSD檔案結構描述 。
加入傳送管線
這邊我們再來新增一個項目,[ 傳送管線 ] ;我們命名為 [ SendPipeline.btp ]。
在管線編輯視窗中,我們從左邊拉一個 [ 一般檔案組合器 ] 到管線的 [ 組合] 區塊,然後在屬性視窗的 [ 管線元件屬性 ]中的文件描述選擇
[ Lab3_Pipeline.Lab3_TxtFileOut ]。表示這個管線
會負責在傳送檔案前進行組合的動作,並且將檔案從 Xml 格式組合而成 Txt 。
建置與部署
終於又到了這個時刻了~~~運氣好的話~~一切都會很順利的建置成功!!部署成功!!!
建立接收埠
要來建立實體接收位置了。這裡我們新增一個連接埠,並且選擇 [ 單向連接埠 ]。
將連接埠命名為 [ Lab3_Pipeline ],這是一個實體連接位置的集合。也就是說裡面可以有很多個連接位置,用意是在同樣一份流程,你可能可以讓許多合作夥伴來使用。雖然就資料角度
而言,大家傳進來的格式都必須遵守我們公司的定義。但是大家傳進來的方式也許都不一樣,有些公司也許會用AP直接跟你溝通,也有些公司是使用 FTP上傳甚至附件夾檔…等等。你的
流程要因應這的不可預測的需求,你的軟體就要可以有彈性的被客製。Biztalk 就提供你一個"邏輯接收集合",你可以針對相同的流程定義不一樣的檔案接收來源。是不是很彈性阿??
這邊我們就新增一個接收位置,命名為 [ Lab3_ Pipleline_Location ]。這邊我們就先定義傳輸類行為 [ File ],在
[ 接收處理常式 ] 中我們選擇 [ BiztalkServerApplication ]。在接收管線這邊
就選擇我們剛剛建立出來的接收管線[ ReceivePipeline ],然後我們去選擇 [ 位址(URI) ]。
我們在電腦上建立兩個實體資料夾,[ Inbound ] 跟 [ OutBound ]。這兩個是要負責接收實體檔案的資料夾。我們在接收資料夾的位址選到你所選擇的那個位置。
然後啟用這個接收位置。
建立傳送埠
要來建立實體傳送位置了。這裡我們新增一個傳送埠。命名為 [ Lab3_PipelSendPort ]。這是我們要傳出去給對方的方式。這邊我們先選擇傳輸類型為
[ File ] 。這邊在實務上就看你的夥伴
怎麼要求了。也許對方會要求你傳FTP過去、或是寄個Mail過去把檔案夾帶成附件…..。
在檔案[ 位置(URI) ] 我們選擇剛剛建出來的 [ OutBound ]那個資料夾。請Biztalk 替我們將檔案放到這裡。
在左邊選擇 [傳送]在裡面的傳送管線我們選擇在Biztalk 專案裡面建立的 [ SendPipeline ]傳送管線。
然後在 [ 篩選器與對應 ] 這裡選到[ 篩選條件 ]。在屬性 [ BTS.ReceivePortName ] = = [ Lab3_Pipeline
] 那個接收埠集合。沒有設定這個的話,你的接收埠在收到檔案後會找不到訂閱者。
這個 Lab 中我們沒有建出訂閱者。所以必須設定傳送埠與接收埠的關係。
再 [ 輸出對應 ] 選擇我們建立的 [ 對應 ]。
啟動這個接收埠。
完成!! 來做測試!!
接著我們來做個測試吧!! 我們將一份訂單 TXT檔案放到 [ Inbound ]資料夾中,然後你會馬上看見這個檔案不見,被你的Biztalk
管線給接走了。然後會在 [ Outbound ]裡面產出一份新的文件
。