2011-10-18 21 views
2

我有一個傳入的平面文件,我希望接收並分解爲不連續的塊以提高處理效率。有一個很好的樣本職位BT2010上獲得平面文件反彙編,以幫助這個位置:使用BizTalk平面文件反彙編程序分割大於1記錄的傳入文件?

http://msdn.microsoft.com/en-us/library/aa560774(v=bts.70).aspx

然而,接近後的底部,你會發現它們定身記錄的最大值出現爲1並整齊地將文件分割成每條記錄一條消息。不過,我想將我的文件分成1000個記錄塊。但是,當試圖將max設置爲1000時,流水線會正常讀取,直到最後一個不是偶數的記錄爲止,然後我們得到意外的流錯誤結束。

有沒有辦法讓股票FF反彙編在這裏玩得很好,還是我們需要編寫一個自定義反彙編器?或者還有其他一些好的方法來獲得我們想要的分塊行爲嗎?

謝謝。

回答

1

發生的最大值用於從傳入消息中刪除消息,而不是確定輸出消息中應該有多少條記錄。因此,您必須創建一個自定義平面文件反彙編程序組件,以批處理方式讀取傳入文件:從流中讀取一些數據(例如基於行數)並將其傳遞。

GetNext方法如何讀取較大文件中的數據似乎存在問題,這可能會導致內存使用量過大(我有一種情況發生在包含大約800 000個行項目的10Mb文件中)。因此,所有需要做的就是重新實現GetNext方法,以滿足您爲每條消息輸出一定數量記錄的情況,同時在處理更大的消息方面更加高效。

這裏原來的GetNext(重要部件)的方法的一部分,反編譯的代碼:

private IBaseMessage GetNext2(IPipelineContext pc) 
    { 
     ... 
      baseMessage = this.CreateOutputMessage(pc); 
     ... 
      baseMessage = this.CreateOutputMessage(pc); 
     ... 
     return baseMessage; 
    } 

的「CreateOutputMessage」方法結束調用「CreateNonrecoverableOutputMessage」方法,該方法是問題似乎在於處理時更大的消息:

internal IBaseMessage CreateNonrecoverableOutputMessage(IPipelineContext pc) 
{ 
    ... 
    XmlReader reader1 = this.m_docspec.Parse(this.m_inputData); 
    ... 
    return message; 
} 

的「m_inputData」變量創建調用「FFDasmComp.DataReaderFunction」代表傳遞到平面文件拆裝部件的構造。您可以通過將自己的數據讀取器方法傳遞到平面文件反彙編程序組件的自定義實現的構造函數中來控制數據的讀取。

有一對夫婦的文章在那裏,但給定的實現具有較大的消息打交道時,一些嚴重的警告:

Debatching Large Messages and Extending Flatfile Pipeline Disassembler Component in Biztalk 2006

Processing 10 MB Flat File in BizTalk