[Spring Batch] (備忘録) ItemReader の動作

ItemReader は処理対象となるオブジェクトを取得する。
実装した、 T read() メソッドがnullを返すまで処理は繰り替えされる。
なので処理としては以下の様になる。

  1. ItemReader でレコードを読み込む
  2. ItemProcessor で何らかの処理
  3. ItemWriter で結果の書き込み。この時再び ItemReader で読み込まれないようにフラグ等をセット

もしくは、処理失敗時の考慮なども必要だが、以下のようにしてもよい。

  1. 初回起動時の ItemReader で全ての対象レコードを読み取る。戻り値は、処理対象のレコードのみ
  2. ItemProcessor で何らかの処理
  3. ItemWriter で何らかの書き込み処理

上記の場合、 ItemReader は状態を保存しておく必要がある。
ItemReader のbean定義に、scope=”step” のようにするとステップ単位でインスタンスが生成される。
scope=”step” にしておけば ItemReader が null を返すまでインスタンス変数は保持される。




[JAVA] フェイルオーバー時や再起動時に NullPointerException や Cannot get property ‘xxxxxx’ on null object

一回エラーになるとブラウザを開き直さないと回復しないバターンがあったらこのケースの可能性大。

サーブレットコンテナは停止時に、セッションを永続化して起動時に復元しようとしている。
Tomcat のディフォルトだと SESSIONS.ser というファイルに保存している。

セッションに保存しているデータが正しく永続化されてないと正しく復元されない。
フェイルオーバー時や再起動時にセッションの中身が null になりNullPointerExceptionが発生したり、 Cannot get property ‘xxxxxx’ on null object というエラーが出る。

セッションに永続化した際に正しく保存するには

を実装すればよい。

serialVersionUIDはググれば出てくると思うが(ググっても説明が下手でわかりづらいかったら)
新規に作成時は、 1L
更新時には(クラスの構造が変わったら)、適当な値。(前と別の値ならなんでもよい)
と覚えておけばよい。