intra-mart Accel Platform IM-Propagation プログラミングガイド 初版 2014-05-01

6. 付録

復元可能なクラスとは

復元可能なクラスとは、直列化されたクラス内のデータが他のクラスで復元を行った際に、直列化前の情報を取得可能であるクラスです。
データの伝搬途中でクラスのインスタンス内容を直列化するため、送信側と受信側では必ずしも同一クラスを使用する必要はありません。
../../_images/appendix_2.png
図 クラスの復元イメージ

注意

構造がまったく違うクラスの場合、直列化データを復元した際にほとんどの情報が失われる場合があります。
直列化の元となるクラスと復元に使用されるクラスの関係上で情報が失われる例は、以下の通りです。
  • 同じ名前のパラメータが存在しない。
  • 同じ名前のパラメータでも、型が異なる。
詳細は「IM-Propagation 仕様書」-「処理仕様」-「直列化(serialize)の処理」を参照してください。

例外クラス

  • 「送信側のデータ変換クラス(Encoder)」「受信側のデータ変換クラス(Decoder)」で独自の例外クラスをスローする場合

    ConvertException を継承した例外クラスを作成してスローしてください。
    通常は ConvertException をスローしてください。
  • 「受信側のデータ処理クラス(Procedure)」で独自の例外クラスをスローする場合

    ProcedureException を継承した例外クラスを作成してスローしてください。
    通常は ProcedureException をスローしてください。
  • PropagationManagerException と、PropagationManagerException を継承している例外クラスは、スローしないでください(IM-Propagation マネージャ専用のため)。

    ../../_images/appendix_1.png
    図 例外クラスの関係

セッションのクローズ漏れを探す

IM-Propagation は内部でセッション管理を行っているため、 decideabortclose メソッドのいずれかを呼び出して、必ずクローズ処理を行う必要があります。
クローズ処理を行わないまま IM-Propagation マネージャのインスタンスを破棄した場合は、以下の誤動作が発生する可能性があります。
  • データベースのトランザクションがいつまでも終わらない。
  • IM-Propagation を使用している箇所で無限ループが発生しハングアップする。
クローズ処理が行われていない箇所を探すには、以下の手順で操作してください。
  1. トレースログを有効に設定します。
    <WEB-INF/conf/log/im_logger.xml> に以下を追記します。
    <logger name="jp.co.intra_mart.system.propagation">
      <level value="trace" />
    </logger>
    
  2. アプリサーバを再起動します。
  3. 誤動作が発生する状態を再現します。すると、以下のようなログが出力されます。
     1 | [DEBUG] j.c.i.s.p.PropagationManagerFactoryImpl - [] use primary. thread id=46
     2 | [DEBUG] j.c.i.s.p.PropagationManagerFactoryImpl - []   stack trace:
     3 |     jp.co.intra_mart.system.propagation.PropagationManagerFactoryImpl.writeStackTrace(PropagationManagerFactoryImpl.java:101)
     4 |     jp.co.intra_mart.system.propagation.PropagationManagerFactoryImpl.getPropagationManager(PropagationManagerFactoryImpl.java:129)
     5 |     jp.co.intra_mart.module_name.function_name.propagation.Trigger.invoke(Trigger.java:43)
     6 |          :
     7 |          :
     8 | [DEBUG] j.c.i.s.p.PropagationManagerFactoryImpl - []   status map={"46":{}}
     9 | [DEBUG] j.c.i.s.p.PropagationManagerPrimary - [] called method. name=begin
    10 | [DEBUG] j.c.i.s.p.PropagationManagerFactoryImpl - [] begin manager. thread id=46
    11 | [DEBUG] j.c.i.s.p.PropagationManagerFactoryImpl - []   status map={"46":{}}
    12 | [DEBUG] j.c.i.s.p.PropagationManagerFactoryImpl - [] primary already used, use secondary. thread id=46
    13 | [DEBUG] j.c.i.s.p.PropagationManagerFactoryImpl - []   stack trace:
    14 |     jp.co.intra_mart.system.propagation.PropagationManagerFactoryImpl.writeStackTrace(PropagationManagerFactoryImpl.java:101)
    15 |     jp.co.intra_mart.system.propagation.PropagationManagerFactoryImpl.getPropagationManager(PropagationManagerFactoryImpl.java:129)
    16 |     jp.co.intra_mart.module_name.function_name.propagation.Trigger.invoke(Trigger.java:43)
    17 |          :
    18 |          :
    
  4. デバッグログから、以下の文字列を探します。
    上記ログの例では、12行目に存在します。
    primary already used, use secondary.
    
  5. その手前の行にある、以下の文字列を探します。
    上記ログの例では、1行目に存在します。
    use primary.
    
  6. そのすぐ後の行にスタックトレースが出力されていますので、その中から以下の文字列を探します。
    上記ログの例では、4行目に存在します。
    jp.co.intra_mart.system.propagation.PropagationManagerFactoryImpl.getPropagationManager
    
  7. そのすぐ下の行に表示されている実装箇所で、IM-Propagation マネージャのインスタンスが作成されていますが、クローズ処理が行われていない可能性があります。
    上記ログの例では、5行目の位置でクローズ処理が行われていない可能性があります。
    jp.co.intra_mart.module_name.function_name.propagation.Trigger.invoke(Trigger.java:43)
    
    この付近の実装を重点的にご確認ください。
    この実装箇所でクローズ処理が正しく行われている場合は、4~6の手順を別のログの場所で行ってください。