2011-09-11 3 views
0

다음 문제에 사용할 패턴에 관해 조언이 필요합니다.이 유형의 문제에 대한 패턴

많은 행이 - (DB에서 MSG_ID로 식별) 우리가 메시지를 부르 자 - 파일에 해당하는 테이블에. 의미, 파일은 여러 조각으로 나뉘어 데이터베이스에 저장됩니다.

파일에 해당하는 부분은 GROUP_ID 열을 사용하여 식별 할 수 있으며 MSG_ID는 개별 메시지에 해당합니다. 기본 키는 GROUP_ID와 MSG_ID의 조합입니다.

이제, 각각의 메시지는 (일반적 결제 지시 (데이터의 K X 128 바이트)이다) 논리 레코드의 해당 번호로 구성된다. 현재의 독서 지불 지시가 끝나는 곳은 다음 128자를 읽은 후에 만 ​​말해 줄 수 있습니다. 또한 지불 지시의 일부는 연속적인 메시지가 될 수 있습니다. 즉, 완전한 지불 지시는 MSG_ID n의 끝과 MSG_ID n + 1의 시작에 걸쳐 퍼질 수 있습니다.

우리는 스프링 배치를 사용하여 처리합니다.

나는 테이블을 쿼리하고 하나 플랫 파일 하나에 모든 레코드를 작성하고 거기에서 스프링 배치를 시작 노력했다.

플랫 파일을 사용하지 않고도이 요구 사항을 충족하는 데 사용할 수있는 패턴이 있는지 알고 싶습니다.

처럼

  1. 읽기 MSG_ID 1 GROUP_ID "ABC"

  2. 별도 DB 결제 지시로부터 상기 프로세서에 각각의 명령을 제공한다.

  3. MSG_ID 1의 끝에 도달하면 MSG_ID 2 및 GROUP_ID "ABC"를 읽지 않고 이전 기록보다 왼쪽에 기록 명령을 추가하여 지불 지시서를 구성하는지 확인합니다. N은 읽기 프로세스를 시작하기 전에 알려진

  4. 읽기 MSG_ID == N까지.

  5. 내가 사용할 수있는 자바 봄 또는 반복자 패턴이 어떤 ItemReaders인가?

더 명확히 말하면 "논리 레코드가 여러 행으로 분산되어있는 경우"를 처리하기위한 패턴이 있습니다.

감사 "DB에서 하나의 행은 'M'수의 논리 레코드를 포함하는 경우, M은 반복자 또는 ItemReaders의이 유형을 사용, 정수하지 않을 경우"에 대한 어떤 패턴이있다.

답변

1

귀하의 시나리오에 맞게 Reader (처리 논리)을 사용자 지정해야한다고 생각합니다. 확실히 일반적인 경우처럼 보이지 않습니다.

제안한 알고리즘이 괜찮은 것 같습니다. Reader을 쓰는 데는 문제가 없어야합니다. 이는 완전한 지불 지침을 읽고 추가 처리를 위해 처리하도록합니다.

+0

이미 플랫 파일에서 읽으려면 작성한 독자 독자가 있습니다. 사용할 더 나은 패턴이있을 수 있다고 생각했습니다. – nobody

+0

중간 결과를 파일에 쓸 필요가 없다고 생각합니다. 데이터베이스에서 지불 지시를 집계하면 시스템에 과부하가되어 집계에 별도의 처리 단계가 필요하지 않습니다.그러나 완전한 지불 지침을 읽고 처리해야하는 문제에 대한 확실한 답은 프로파일 링 수단을 통해 얻을 수 있습니다. 옵션을 명확하게하려면 다음을 수행 할 수 있습니다. a) 파일/다른 테이블에 집계 한 다음 일괄 처리를 실행합니다. b) 일괄 처리를 실행하는 동안 집계합니다. – dm3

+0

나는 플랫 파일에 왜 썼는지 설명하지 못했다고 생각합니다. 플랫 파일에 쓰기는 Spring의 분할 옵션을 사용하기 위해 생각한 한 가지 방법이었습니다. 그러나 그것은 1. 데이터베이스에서 읽는 것, 2. 파일에 쓰는 것, 3. 스플릿을 결정하는 것, 4. 플랫 파일에서 읽는 것, 단계는 과도한 것입니다. 그래서 나는 두 번째 옵션을 추구하기로 결정했습니다. 즉, 플랫 파일을 없애고, 판독기의 데이터베이스에서 읽은 다음 Object를 프로세서로 전달합니다. – nobody

관련 문제