Forums: Open Discussion (Thread #21779)

ステータス及び終了コードが管理テーブルに反映されるまで、 30分以上かかる現象に悩まされて (2009-02-21 19:59 by Anonymous #42042)

お世話になります。
ReturnCode.ERROR_ENDでBLogicを復帰した際、ステータス及び終了コードが管理テーブルに反映されるまで、
30分以上かかる現象に悩まされています。

【前提】
非トランザクションモデル(NoTransactionBean.xml)を選択し、プログラマティックなトランザクション管理を
行っています。

【現象】
ファイルコレクタにより、入力ファイルを一行毎にBLogicで読み込み且つ検査しています。
エラー数が最大続行数を超えた場合、異常終了させようとしています。

public BLogicResult execute(Object object, JobContextEx jobContextEx) {

if (エラー数が最大続行数を超えた) {
// エラーカウントをオーバしている場合、なにもせず処理を終了
return new BLogicResult(ReturnCode.ERROR_END、終了コード); ■

}

ファイル行数が少ない場合は、正常に動作します。 ところが、行数が膨大になると、上記の■の部分でタイムアウトする
までブロックしているようで、管理テーブルのステータス及び終了コードが更新されません。
最大続行数は10行としているですが、ステータス及び終了コードが変化するまで約30分かかる場合があります。
このような現象は、AutoCommitとした場合や、ファイルの読み込みを行わないダミーコレクタを使った場合では発生しません。
他の記事から、管理テーブルの競合が発生し、トランザクションのタイムアウトまで更新されないのではないかと思われますが、対処方法が想像つきません。
何か対処方法はあれば、お教え願います。

Reply to #42042×

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: ステータス及び終了コードが管理テーブルに反映されるまで、 30分以上かかる現象に悩まされて (2009-02-23 10:25 by luvwave #42066)

お疲れ様です。
現像を見ると予想しているとおり
「管理テーブルの競合が発生し、トランザクションのタイムアウトまで更新されないのではないか」
が原因だと思います。

>return new BLogicResult(ReturnCode.ERROR_END、終了コード); 
上の処理ではスレッドを停止する処理は行っていません。
一般的なインスタンスの生成処理です。

それと
>このような現象は、AutoCommitとした場合や、ファイルの読み込みを行わないダミーコレクタを使った場合では発生しません。
の内容をみるとコレクタの中で管理テーブルの情報を行ロックしていろと思われます。

まずは、業務の中から管理テーブルに対して行っている処理があるか確認してみてください。

上の内容を見るとFWの不具合の可能性もあるので出来れば利用しているFWのバージョンも教えてください。

以上、よろしくお願いいたします。

Reply to #42042

Reply to #42066×

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: ステータス及び終了コードが管理テーブルに反映されるまで、 30分以上かかる現象に悩まされて (2009-02-23 10:52 by Anonymous #42069)

早速のご回答ありがとうございます。

>業務の中から管理テーブルに対して行っている処理があるか確認してみてください。
・BLogicの中では、管理テーブルに対して更新は行っていません。
・PreLogicの中では、管理テーブルに対して更新は行っていません。
・ファイルコレクタでは、jobStatus.incrementCollected()やreturn new CollectorResult(ReturnCode.ERROR_END, collected)を行っています。

>FWのバージョンも教えてください。
terasoluna-batch4j-src_2.0.0.4.zip とあるので、2.0.0.4 と思われます。

ファイルコレクタを使用している場合、非トランザクションモデル(NoTransactionBean.xml)ではなく、
チャンク別トランザクションモデル(ChunkTransactionBean.xml)を用いなければならないということは
ないでしょうか?。
Reply to #42042

Reply to #42069×

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: ステータス及び終了コードが管理テーブルに反映されるまで、 30分以上かかる現象に悩まされて (2009-02-23 12:45 by kuramotoki #42073)

> ファイルコレクタを使用している場合、非トランザクションモデル(NoTransactionBean.xml)ではなく、
> チャンク別トランザクションモデル(ChunkTransactionBean.xml)を用いなければならないということは
> ないでしょうか?。
非トランザクションモデルでも非同期実行は可能です。

参考までに、ご利用のデータベースをお教え願えますか?
Reply to #42069

Reply to #42073×

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: ステータス及び終了コードが管理テーブルに反映されるまで、 30分以上かかる現象に悩まされて (2009-02-23 12:59 by Anonymous #42079)

お世話になります。

>参考までに、ご利用のデータベースをお教え願えますか?
Oracle10gです。

>> ファイルコレクタを使用している場合、非トランザクションモデル(NoTransactionBean.xml)ではなく、
>> チャンク別トランザクションモデル(ChunkTransactionBean.xml)を用いなければならないということは
>> ないでしょうか?。
>非トランザクションモデルでも非同期実行は可能です。
チャンク別トランザクションモデルならば、NORMAL_ENDでトランザクションがコミットされ、ERROR_ENDならば、
ロールバックされるため、申しました。
Reply to #42073

Reply to #42079×

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: ステータス及び終了コードが管理テーブルに反映されるまで、 30分以上かかる現象に悩まされて (2009-02-23 13:32 by kuramotoki #42084)

情報提供ありがとうございます。
追加で申し訳ないのですが、
・プログラマティックなトランザクション処理を外しても再現するか
・どの処理(主処理、コレクタ処理など)において、どのようなトランザクション処理をしているか
の2点について、教えていただけますか。
Reply to #42042

Reply to #42084×

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: ステータス及び終了コードが管理テーブルに反映されるまで、 30分以上かかる現象に悩まされて (2009-02-23 13:45 by Anonymous #42086)

お世話になります。
>・プログラマティックなトランザクション処理を外しても再現するか
これは外せません。

>・どの処理(主処理、コレクタ処理など)において、どのようなトランザクション処理をしているか
コレクタ処理ではトランザクションは行っていません。
主処理では、ジョブ管理テーブル以外の更新処理をおこなっています。
前処理及び後処理でもジョブ管理テーブルを対象とするトランザクションは行っていません。

Reply to #42084

Reply to #42086×

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: ステータス及び終了コードが管理テーブルに反映されるまで、 30分以上かかる現象に悩まされて (2009-02-23 17:30 by kuramotoki #42089)

了解しました。
なお、デバッグ実行していくと
return new BLogicResult(ReturnCode.ERROR_END、終了コード); 
にて固まるという認識でよいでしょうか。
# データベースのデッドロックであれば、そこではなく、
# JobControlTableHandlerImpl#updateJobEnd(JobInfo)
# で固まるのではないかと思います。

BLogicResultのnewで固まるのであれば、
JVMのメモリを多くとっても結果は変わらないでしょうか。
以上、よろしくお願いいたします。
Reply to #42086

Reply to #42089×

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: ステータス及び終了コードが管理テーブルに反映されるまで、 30分以上かかる現象に悩まされて (2009-02-23 17:49 by Anonymous #42091)

お世話になっています。

デバッグ実行したわけではありません。
return new BLogicResult(ReturnCode.ERROR_END、終了コード);
で固まるとも思ってはいなくて、ビジネスロジック処理結果ハンドラ(BLogicResultHandlerインタフェース)の
StandardBLogicResultHandler か TransactionalBLogicResultHandler で行われる状態変更でトランザクションタイムアウト
までブロックしているのではないかと思っています。
「BE-05 処理結果ハンドリング機能」を参照し、そう考えました。
Reply to #42089

Reply to #42091×

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: ステータス及び終了コードが管理テーブルに反映されるまで、 30分以上かかる現象に悩まされて (2009-02-24 12:00 by kuramotoki #42102)

申し訳ありませんが状況が判断できないので、再度何点か質問させてください。

1.そのジョブは同期型実行では意図したとおり処理できるでしょうか?
2.非同期バッチデーモンのキューサイズは再設定していますか?
3.ジョブを1件のみ登録した状態で非同期バッチデーモンを起動しているのでしょうか?
4.トランザクションのかけ方はどのような形ですか(1件ごと、全件など)?
5.行数が膨大とは何件くらいでしょうか、またダミーコレクタでも同じ件数で試しているのでしょうか?

以上、よろしくお願いいたします。
Reply to #42091

Reply to #42102×

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: ステータス及び終了コードが管理テーブルに反映されるまで、 30分以上かかる現象に悩まされて (2009-02-24 14:51 by Anonymous #42106)

お世話ににっなっております。

>1.そのジョブは同期型実行では意図したとおり処理できるでしょうか?

同期型でも非同期型でも意図したとおり処理できております。契機は不明ですが(データ量でもないようです)、処理結果
のDBへの更新が遅延し、その間、新たな非同期ジョブが起動できなくなります。1時間後に突然起動されたりします。
「起動状況」を「起動中」に更新できないため、ジョブがキューに追加されないことによると思います。

>2.非同期バッチデーモンのキューサイズは再設定していますか?

しておりません。
デーモン用 Bean 定義ファイル(AsyncBatchDaemonBean.xml)から指定するジョブ多重実行数のことでしょうか?

>3.ジョブを1件のみ登録した状態で非同期バッチデーモンを起動しているのでしょうか?

そうです。

>4.トランザクションのかけ方はどのような形ですか(1件ごと、全件など)?

1件ごとです。

>5.行数が膨大とは何件くらいでしょうか、またダミーコレクタでも同じ件数で試しているのでしょうか?

行数とは無関係であることは最近わかりました。

※ジョブ管理テーブルの処理結果更新は業務ロジックで行うとして、FWで行っている更新を行わないようにしたいのですが、どうすればよいでしょうか?。それが近道のような気がします。
Reply to #42102

Reply to #42106×

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: ステータス及び終了コードが管理テーブルに反映されるまで、 30分以上かかる現象に悩まされて (2009-02-24 15:17 by Anonymous #42107)

お世話になっております。

最初のメールに書いたとおり、次の■のルートのみで発生する現象です。

public BLogicResult execute(Object object, JobContextEx jobContextEx) {

if (エラー数が最大続行数を超えた) {
// エラーカウントをオーバしている場合、なにもせず処理を終了
return new BLogicResult(ReturnCode.ERROR_END、終了コード); ■

}

エラー数が0で上記ルートに入らない場合は、膨大なデータ量でも正常に動作します。
処理結果更新が遅延することはまったくないです。

ValidationResultHandlerを拡張して、ファイルコレクタでデータ検証を行っています。ここでも上記と同様のロジックを実装していますが、問題は発生しません。

BLogicの入り口で、BLogicResult(ReturnCode.ERROR_END)とする場合に、時折、発生する現象です。

コレクタはチャンクサイズ分データをまとめて(キューに入れているのでしょうか)、BLogicに渡しますが、
キューに入ったまま、BLogicResult(ReturnCode.ERROR_END)で復帰すると、新たなジョブが起動できなかったり、
ジョブ管理テーブルへの結果更新が遅延したりするようなことは考えられないでしょうか?
実行し検証しているとそのような感触を持ちます。
Reply to #42042

Reply to #42107×

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: ステータス及び終了コードが管理テーブルに反映されるまで、 30分以上かかる現象に悩まされて (2009-02-24 16:38 by Anonymous #42115)

お世話になっております。

他の記事を参考にし、キューサイズを変更してみることにしました。
次の設定が関連すると思われます。

/batchapps/template/NoTransactionBean.xml
<!-- ===================== マネージャ定義 ===================== -->
<!-- 一段目のマネージャ -->
<bean id="jobManager" parent="baseManager">
<property name="name" value="noTransactionJobManager" />
<property name="collector" ref="collector" />
<property name="workQueueFactory">
<bean class="${workQueueFactory.class}">
<property name="workerExecutorService" ref="workerExecutorService" />
<property name="queueLength" ref="chunkQueueLength" />■

■/batchapps/common/DefaultValueBean.xml
<!-- チャンクキューサイズ -->
<bean id="chunkQueueLength" class="java.lang.Integer">
<!-- 10 → 100 -->
<constructor-arg value="100" />●
</bean>

以下は、queueLength をキーにして検索しましたが、同様に変更する必要のあるものか
教えてもらえませんでしょうか?

/batchapps/common/AsyncBatchDaemonForCommonjBean.xml

<!-- 非同期バッチ起動用のマネージャ -->
<bean id="jobManager" parent="baseManager">
<property name="name" value="AsyncBatchDaemonManager" />
<property name="collector" ref="batchDaemonJobCollector" />
<property name="workQueueFactory">
<bean class="${workQueueFactory.class}">
<property name="workerExecutorService" ref="workerExecutorService" />
<property name="queueProcessor" ref="asyncBatchDaemonQueueProcessor" />
<property name="queueLength" value="10" />●

/batchapps/common/AsyncBatchDaemonBean.xml

<!-- ===================== マネージャ定義 ===================== -->
<!-- 非同期バッチ起動用のマネージャ -->
<bean id="jobManager" parent="baseManager">
<property name="name" value="AsyncBatchDaemonManager" />
<property name="collector" ref="batchDaemonJobCollector" />
<property name="workQueueFactory">
<bean class="jp.terasoluna.fw.batch.standard.StandardWorkQueueFactory">
<property name="workerExecutorService" ref="workerExecutorService" />
<property name="queueProcessor" ref="asyncBatchDaemonQueueProcessor" />
<property name="queueLength" value="10" />●
Reply to #42042

Reply to #42115×

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: ステータス及び終了コードが管理テーブルに反映されるまで、 30分以上かかる現象に悩まされて (2009-02-24 18:04 by Anonymous #42118)

お世話になっています。
キューサイズの変更は、無意味でした。
Reply to #42115

Reply to #42118×

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: ステータス及び終了コードが管理テーブルに反映されるまで、 30分以上かかる現象に悩まされて (2009-02-24 18:37 by kuramotoki #42123)

フレームワークの動作として、
ERROR_ENDでワーカ側が終了してもコレクタ側でデータを取得し続けているのですが、
それが原因かもしれません。
データの取得を止める契機はコレクタとワーカをつないでいるキューが一杯になり
WorkQueue#checkJobStatus()が実行されたタイミングです。

チャンクサイズを大きめに設定していると、キューがいっぱいになるまで
WorkQueue#checkJobStatus()が実行されず処理が終了しないと思います。

上記の予測を検証するために、チャンクサイズを1にして再現するかご確認下さい。
ジョブBean定義ファイルに
<!-- チャンクサイズ -->
<bean id="chunkSize" class="java.lang.Integer">
<constructor-arg value="1" />
</bean>
と記述し再度実行していただければと思います。
Reply to #42118

Reply to #42123×

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: ステータス及び終了コードが管理テーブルに反映されるまで、 30分以上かかる現象に悩まされて (2009-02-24 20:03 by Anonymous #42131)

お世話になっております。

チャンクサイズを1にしても再現します。コレクタは終了しておりません。

>フレームワークの動作として、ERROR_ENDでワーカ側が終了してもコレクタ側でデータを取得し続けているのですが、

思うに、BLogicはERROR_ENDで終了しているのですから、FW側でコレクタを速やかに終了すべきかと思います。
強制的にコレクタのデータを取得を終了させる手段はありませんでしょうか?。
Reply to #42042

Reply to #42131×

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: ステータス及び終了コードが管理テーブルに反映されるまで、 30分以上かかる現象に悩まされて (2009-02-24 20:54 by Anonymous #42132)

お世話になっております。
解決しました。当方で作成したファイルコレクタのバグが原因で、BLogicが異常終了してもコレクタが
動作し続けておりました。
お手間を取らせまして、真に申し訳けございませんでした。
Reply to #42131

Reply to #42132×

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: ステータス及び終了コードが管理テーブルに反映されるまで、 30分以上かかる現象に悩まされて (2009-02-25 11:15 by kuramotoki #42142)

了解しました。解決でき、良かったです。
また、誠に勝手ながらデバッグログを貼っていただいておりましたが、
おそらく公開してはいけないと思われる内容が含まれていましたので、
勝手ながら該当メッセージを削除させていただきました。
申し訳ございませんが、よろしくお願いいたします。
Reply to #42132

Reply to #42142×

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