クラス ForeachExecuteAfter

すべての実装されたインタフェース:
ClientInterface, CommonInterface, jp.ne.mki.wedge.run.interfaces.RuleEngineInterface

public class ForeachExecuteAfter extends AbstractClient

Foreachループ処理(Afterイベント実行)


In(0)に設定されたアイテムを複数回呼び出します。
In(1)以降に設定したCOLTEXTアイテムの行数分ループ処理が実行され、
処理の各々で、その行のデータをOutのTEXTアイテムに設定します。

例)
InputRecord

アイテム名 データ
EVENT_ITEM  
COL_ID 0001 0002 0003 0004
COL_名称 AA BB CC DD
OutputRecord
アイテム名 データ
TXT_ID  
TXT_名称  

実行時の動作
この場合、COLTEXTが四行分のデータがあるため、
四回、EVENT_ITEMのAfterの処理が実行されます。

一回目は、TXT_IDに[0001]、TXT_名称に[AA]という文字が設定されます。

以下
二回目:TXT_ID=[0002], TXT_名称=[BB]
三回目:TXT_ID=[0003], TXT_名称=[CC]
四回目:TXT_ID=[0004], TXT_名称=[DD]

と、ループのたびにOutRecordの値を変更しながら動作することとなります。

ループ処理はパフォーマンスの低下に繋がることがございます。
特にループ処理の中でトランザクション呼び出しを行うと、
ループのたびに通信処理が動作するため 著しくパフォーマンスが
低下することとなります。

ループを使用しなくて実装が可能な場合は、
極力 ループを使用せずに実装することを推奨します。


例)
アイテム名 データ
ID 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010
名称 AA BB CC DD EE FF GG HH II JJ
種別 1 2 2 1 2 2 1 1 1 2
このデータのうち
種別が1のレコードは トランザクション1を呼出し、
種別が2のレコードは トランザクション2を呼び出すような
処理を実装することとします。

処理パフォーマンスの悪い実装(ループ処理)

ForeachDecisionTableを使用して、1レコードずつにループを行います。
ループ内で、都度 サーバ へ接続をしてトランザクションを実行します。

このようにすると、最大10回 トランザクション処理が
動作することとなります。
10回であればさほど処理速度の低下は気にならないかもしれませんが、
これが1000レコード、10000レコードとなると、処理の遅さが
目に見えるかと思います。

処理パフォーマンスの良い実装(項目郡毎の一括処理)

IfMatchParamThenCopyValueを使用して、レコードを二つの項目郡に分けます。

IfMatchParamThenCopyValueを使って、種別が1のレコードを抽出。
アイテム名 データ
ID_1 0001 0004 0007 0008 0009
名称_1 AA DD GG HH II
種別_1 1 1 1 1 1

IfMatchParamThenCopyValueを使って、種別が2のレコードを抽出。
アイテム名 データ
ID_2 0002 0003 0005 0006 0010
名称_2 BB CC EE FF JJ
種別_2 2 2 2 2 2
その後、これらのデータをそれぞれトランザクション1、トランザクション2に 引き渡します。
こうするとサーバへの接続は2回のみで済み、
前述した ループの方法と比べた場合、非常に高速に処理ができます。

JDK1.5では、CaretのUpdatePolicyを NEVER_UPDATEにしているときに テキストフィールドに対して値を設定をすると、 CaretのRepaintEventが都度発生します。
そのため、ループ処理で何度もテキストフィールドの値を更新すると、 OutOfMemoryErrorが発生することがございます。
(OutOfMemoryError はログ出力中にエラーが発生することがあるため、 ログに正常に出力されない場合もあります。ご注意下さい。)

この問題に対応するためには、ループ処理の実行前に
SetCaretUpdatePolicyをを使用して、 UpdatePolicyを NEVER_UPDATEにして下さい。
(テキストフィールドの挙動が変わるため、 SetCaretUpdatePolicyのパラメータに-tempを指定してください。)


[I/O RECORD]

InputRecord OutputRecord
  1. イベントアイテム
  2. COLTEXTデータ(複数指定)
  1. TEXTデータ(複数指定、InのCOLTEXTデータと同数)

[RULE PARAMETER]

Parameter
導入されたバージョン:
1.2.0-04
バージョン:
1.0
  • フィールド詳細

    • caretReturnRunnables

      List caretReturnRunnables
  • コンストラクタの詳細

    • ForeachExecuteAfter

      public ForeachExecuteAfter()
  • メソッドの詳細

    • getIOParameter

      public int getIOParameter() throws Throwable
      インタフェースからコピーされた説明: CommonInterface
      IOパラメータ取得。execute の前に実行される。
      戻り値:
      int OK=処理続行、IO_ERROR=入出力レコードエラー、IO_ERROR_IN=入力レコードエラー、IO_ERROR_OUT=出力レコードエラー、 IO_ERROR_IO_MUST_SAME_COUNT=入力レコード数と出力レコー数の非合致エラー、IO_ERROR_PARAMETER=パラメータエラー、 IO_ERROR_EXECUTE_PARAMETER=実行リストパラメータエラー
      例外:
      Throwable
      関連項目:
    • execute

      public int execute() throws Throwable
      インタフェースからコピーされた説明: CommonInterface
      処理を実行。
      戻り値:
      int OK=処理続行、ERROR=異常終了、CANCEL=処理を中断(正常終了)、SKIP=次行を実行しない、USER_ERROR=戻り値をユーザ側で任意に設定
      例外:
      Throwable
      関連項目:
    • exit

      public void exit() throws Throwable
      インタフェースからコピーされた説明: CommonInterface
      終了処理。保持していた変数などを開放する処理を記述します。
      execute の後に実行されます。
      正常終了・異常終了などに関わらず必ず実行されます。
      例外:
      Throwable
      関連項目: