2011-10-18 2 views
2

필자는 들어오는 플랫 파일을 수신하여보다 효율적인 처리를 위해 개별 청크로 분리하려고합니다.BizTalk 플랫 파일 디스어셈블러를 사용하여 들어오는 파일을 1보다 큰 레코드로 분할합니까?

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

당신은 그들이 최대 몸 기록 발생 설정할 것을 볼 수 게시물의 하단에, 그러나이 여기에 도움이 플랫 파일 디스어셈블러를 얻기에 BT2010을위한 좋은 샘플 포스트가 1로 설정하고 파일을 레코드 당 하나의 메시지로 깔끔하게 분할합니다. 그러나, 나는 1000 파일의 청크로 내 파일을 분할하고 싶습니다. 그러나 max를 1000으로 설정하려고 시도하면 파이프 라인은 1000 개의 레코드가 아닌 마지막 청크까지 읽히고 예기치 않은 스트림 오류가 발생합니다.

여기에 좋은 FF 디스어셈블러를 가져 오는 방법이 있습니까? 아니면 사용자 정의 디스어셈블러를 작성해야합니까? 아니면 우리가 원하는 청킹 행동을 취할 수있는 다른 좋은 방법이 있습니까?

감사합니다.

답변

1

최대 발생은 수신 메시지의 메시지를 평가하기 위해 사용되며 출력 메시지에 포함되어야하는 레코드 수를 결정하는 데 사용되지 않습니다. 따라서 들어오는 파일을 일괄 적으로 읽는 사용자 지정 플랫 파일 디스어셈블러 구성 요소를 만들어야합니다. 스트림에서 일부 데이터를 읽고 (예 : 줄 수에 따라) 전달합니다.

GetNext 메서드가 대용량 파일의 데이터를 읽는 방법에 문제가있어 과도한 메모리 사용을 초래할 수 있습니다 (약 800,000 개의 항목이 포함 된 10MB 파일에서 발생하는 시나리오가 있음). 따라서 모든 메시지 당 특정 수의 레코드를 출력하는 시나리오를 처리하고 동시에 더 큰 메시지를 처리하는 데 더 효율적이되도록 GetNext 메서드를 다시 구현해야합니다. 처리시

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

은 "CreateOutputMessage"방법은 문제가 놓여 것 인 "CreateNonrecoverableOutputMessage"메소드를 호출 끝낸다 : 여기

원래 GETNEXT (중요한 부분) 방법의 일부 디 컴파일 코드 큰 메시지 :

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