フォーラム: 公開討議 (スレッド #37300)

TERASOLUNA Batch Framework for JavaのDBCollectorについて (2015-11-18 10:23 by ビン #77204)

お疲れ様です。

TERASOLUNA Batch Framework for Java 3.x.xを利用しております。
BLogicの中に、DBCollectorを利用して、データを取得していますが、
問題は取得した結果が0件の判断できませんね。
QueryDAOを利用すれば判断できますが、DBCollectorを利用する場合、どのような判断できるのかお教えて頂けませんか。

宜しくお願い致します。

メッセージ #77204 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

Re: TERASOLUNA Batch Framework for JavaのDBCollectorについて (2015-11-25 20:05 by komodan #77247)

利用されているTERASOLUNA Batch Framework for Java(以下、フレームワークと言います)のバージョンが3.2.0以降であれば、
Collector#hasNextを利用して取得した結果が0件かどうか判断できます。
(Collector#hasNextはCollector#nextで次に返却するデータが無い場合はfalseを返すメソッドです。)

■サンプルコード
(同梱されているチュートリアルのSMP001BLogicのコードを元にしています)
===
// コレクタ
Collector<NyusyukkinData> collector = new DBCollector<NyusyukkinData>(
this.queryRowHandleDAO, "SMP001.selectNyusyukkin", null);
try {
NyusyukkinData inputData = null;
if (!collector.hasNext()) {
// 取得したデータが0件だった場合の処理
return 0;
}

while (collector.hasNext()) {
// 取得したデータ1件ごとに対する処理
inputData = collector.next();
}
===

上記の手順は一例のご紹介になります。
拡張入力チェックエラーハンドラクラスを指定していた場合など、
他の条件によっては、別の方法をご紹介できると思います。

上記の方法ではやりたいことを満たせなかった場合は、
お手数ですが使用しているフレームワークの詳細なバージョンも添えて詳細にご質問いただけますでしょうか。

フレームワークの詳細なバージョンは、
お使いのterasoluna-batch-3.x.x.jarを解凍した中にあるMETA-INF/MANIFEST.MFファイルにある
Implementation-Versionの記述から確認できます。

よろしくお願いします。
#77204 への返信

メッセージ #77247 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

Re: TERASOLUNA Batch Framework for JavaのDBCollectorについて (2015-11-26 18:41 by ビン #77257)

[Reply To Message #77247]
> 利用されているTERASOLUNA Batch Framework for Java(以下、フレームワークと言います)のバージョンが3.2.0以降であれば、
> Collector#hasNextを利用して取得した結果が0件かどうか判断できます。
> (Collector#hasNextはCollector#nextで次に返却するデータが無い場合はfalseを返すメソッドです。)
>
> ■サンプルコード
> (同梱されているチュートリアルのSMP001BLogicのコードを元にしています)
> ===
> // コレクタ
> Collector<NyusyukkinData> collector = new DBCollector<NyusyukkinData>(
> this.queryRowHandleDAO, "SMP001.selectNyusyukkin", null);
> try {
> NyusyukkinData inputData = null;
> if (!collector.hasNext()) {
> // 取得したデータが0件だった場合の処理
> return 0;
> }
>
> while (collector.hasNext()) {
> // 取得したデータ1件ごとに対する処理
> inputData = collector.next();
> }
> ===
>
> 上記の手順は一例のご紹介になります。
> 拡張入力チェックエラーハンドラクラスを指定していた場合など、
> 他の条件によっては、別の方法をご紹介できると思います。
>
> 上記の方法ではやりたいことを満たせなかった場合は、
> お手数ですが使用しているフレームワークの詳細なバージョンも添えて詳細にご質問いただけますでしょうか。
>
> フレームワークの詳細なバージョンは、
> お使いのterasoluna-batch-3.x.x.jarを解凍した中にあるMETA-INF/MANIFEST.MFファイルにある
> Implementation-Versionの記述から確認できます。
>
> よろしくお願いします。

ご回答、ありがとうございます。

> if (!collector.hasNext()) {
> // 取得したデータが0件だった場合の処理
> return 0;
> }
取得データは0件だけではなく、DBアクセスなどの例外もReturn 0となりますね。
#77247 への返信

メッセージ #77257 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

Re: TERASOLUNA Batch Framework for JavaのDBCollectorについて (2015-11-27 19:21 by komodan #77261)

書いていただいたとおり、例外が発生した際にもReturn 0となる(Collector#hasNextがfalseとなる)場合があります。

DBアクセス例外やデータの入力チェックエラー例外が発生した時に、
拡張例外ハンドラや入力チェックエラーハンドラを使って
CollectorExceptionHandlerStatus(ValidateErrorStatus)のSKIPやENDをreturnすると、例外が発生したデータを無視します。

例えば、例外発生データ1件だけがDBに格納されていたとして、例外ハンドラでSKIPやENDを設定する実装になっていると、
例外発生データ1件を無視するので、結果的に0件という扱いになってしまいます。

上記の状況にあてはまっていますでしょうか?
#77257 への返信

メッセージ #77261 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする