2012-11-15 1 views
0

나는 큰 로그 파일을 Camel 기반 ESB에 처리하여 시나리오를 작성했습니다.EOF를 나타내는 데 사용할 수있는 낙타 EIP 패턴은 무엇입니까?

<log-record level="INFO" source="MyApp" .../> 

<log-record/> XML 조각의 각 하나를 XML 조각 로그 파일에서 로그 메시지를 구문 분석, 하나 (실시간) 하나, 그리고 생성 - LogTransformer -이 버스의 첫 번째 정류장은 프로세서입니다 메시지 대기열에 놓이고 버스에서 가져옵니다. 결국 MySQL DB에 저장됩니다.

나는 로그 파일이 완전히 (버스에 의해 처리, 모든 로그 기록이 <log-record/>로 변환 큐에 한하고, DB에 저장) 처리 된 후 나는 킥오프 할 특정 프로세서를 가지고있다. 보고서 생성기, BI 구성 요소 등이 있습니다. 이러한 프로세서는 전체 로그가 대기열에 들어갈 때까지 시작해서는 안됩니다.

낙천적 인 방법으로 자동으로 이러한 프로세서에 알릴 수있는 낙타 방식은 무엇입니까? 이 로그 처리를 완료

LogTransformer 프로세서 (로그 기록을 분석 <log-record> XML로 변환하고이를 큐에 넣 부분을)하는 것입니다 가지고 올 수있는 최선의 EOF를 로그 기록을 작성합니다. <log-record eof="true">과 같은 것입니다. 그런 다음이 메시지를 보통처럼 대기열에 포함시킵니다.

버스에있는 마지막 프로세서 (MySQL에 <log-record>을 계속 유지함)는 EOF 로그 레코드가 지속되는 대신 대기열에 대기열에 포함됩니다.

이 보고서 생성기, BI 구성 요소 등은이 대기열의 메시지가 시작되기를 기다립니다.

이 솔루션은 복잡한 것처럼 보입니다. 저는 ESBs와 Camel에 대해 아주 새로운 제품입니다. 그래서이 시나리오를 처리하는 EIP/프로세서가있을 것이라고 생각했지만, 찾을 수없는 것 같습니다. 낙타 마법사는이 솔루션을 어떻게 구성합니까?

답변

0

Splitter (http://camel.apache.org/splitter.html)와 Aggregator (http://camel.apache.org/aggregator2.html)를 살펴보십시오. 집계자는 completionSize를 사용하여 처리를 계속하는 데 필요한 모든 조각이 있는지 확인할 수 있습니다.

+0

감사합니다. @JimN (+1) - 내 로그 파일에 로그 레코드가 1 억 개가 있다면 어떻게 될까요? 메모리에 100M 레코드를 보유한 단일 Aggregator를 가질 수 있다고 생각하지 않습니다! 실행을 시작할 수있는 다른 프로세서에 "플래그 지정"하는 다른 솔루션? –

+0

집계자는 모든 데이터 레코드를 집계 (캐시) 할 필요가 없습니다. 모든 로그 레코드가 언제 보여 졌는지를 결정하기위한 센티널로 사용될 수 있습니다. – JimN

관련 문제