Forums: Open Discussion (Thread #21653)

【バッチFW】バッチ(非同期型)の設計にあたって (2009-02-13 15:00 by Anonymous #41835)

非同期型ジョブでのバッチの設計にあたって、アドバイスいただければと思います。

【バッチ処理概要】
複数の支店(それぞれにデータベース有)からデータを取得。
本社のデータベースにすべての支店の取得データを一括でインサートする。

【質問】
①一つのバッチ処理で複数のデータベースから入力データを取得(コレクタ)することは可能でしょうか?
それとも、支店の数だけバッチを作成する必要があるのか、または、一つのバッチで処理する場合には同期実行で支店コードをパラメータとして渡し、順番に実行していくしかないのでしょうか?
②一つのバッチで非同期処理可能な場合、どのような組み立てが可能でしょうか?

機能説明書は読んだのですが、質問部分についての項目が不明(読み落としかもしれません)でした。

どうぞよろしくお願いします。


Reply to #41835×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 【バッチFW】バッチ(非同期型)の設計にあたって (2009-02-13 18:09 by kuramotoki #41837)

いただいた質問についてですが、プロジェクトの1バッチ処理の粒度にも関係する内容ですが、
ジョブの個数が膨大で登録しきれない、もしくはマシンリソースを抑える必要があるなど
特別な理由がないならば、支店ごとにジョブを分割し実行していくのが素直な実装のように感じます。
理由は、処理エラー時の対処が複雑になってしまうためです。

以下、個々の質問について回答します。
①について
> 一つのバッチ処理で複数のデータベースから入力データを取得(コレクタ)することは可能でしょうか?
FWデフォルトの実装は、単一のデータソースから取得処理をするようになっているため、
複数のデータベースから取得する場合は、複数のデータソースから取得処理するように
コレクタを自作する必要があります。

ジョブ実装の際にFWの分割実行を使わない場合は、1つのコレクタの中で
逐次複数データソースからデータを集めていくことになりますが、
並列に処理が動かないので性能要件を満たせるか状況次第かと思います。
またデータ取得の順序性なども考慮する必要があるでしょう。

分割実行を使う際は、ジョブコンテキストにどのデータソース(どのDAO)を使うかの情報を与え、
すべてのDAOをDIしておいてどれを利用するか子ジョブ毎に決定する、または
DIコンテナを参照できるようにしておいてgetBeanするなど、
方法はあると思いますが、処理・制御が複雑になるのでお奨めしません。

> 支店の数だけバッチを作成する必要があるのか、または、
> 一つのバッチで処理する場合には同期実行で支店コードをパラメータとして渡し、順番に実行していくしかないのでしょうか?
処理内容によります。
パラメータで処理対象を動的に切り替えて実行すればよいのであれば
そのようにした方が楽かと思います。
その際に、1支店ごとに逐次実行する必要があるのか、複数支店を並列実行できるのかは状況次第ですが、
並列処理をするのであればデータベースの競合が起きないようにお気をつけ下さい。

また、上記の処理は同期/非同期どちらでも実行することができます。

②について
> 一つのバッチで非同期処理可能な場合、どのような組み立てが可能でしょうか?
1つのバッチの意図がうまく汲み取れているか自信がありませんが、
1バッチで全ての支店を処理するという意味であれば、
デーモンをあらかじめ常駐させておき、
ジョブ自体はパラメータで処理対象を切り替える形式にしておき、
その1バッチの中で
・実行したいジョブをすべてジョブ管理テーブルに登録する
・デーモンがすべてのジョブを処理するまで待つ(管理テーブルをポーリングするなど)
とすれば、おっしゃる形に近いかと思います。

冒頭に述べたとおり、可能であればスケジュールバッチとして設計した方が
素直で管理しやすいかと思います。

長文失礼しました。以上です。
Reply to #41835

Reply to #41837×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 【バッチFW】バッチ(非同期型)の設計にあたって (2009-02-13 18:33 by Anonymous #41838)

kuramotokiさま

早々にアドバイスいただきましてありがとうございました。
内容を吟味して、より環境に見合った形に作り上げていきたいと思います。

作り上げていく中で不明な点があった場合には再度質問させていただきたいと思います。
どうぞよろしくお願いします。
Reply to #41835

Reply to #41838×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login