ストリームデータ処理基盤 uCosminexus Stream Data Platform - Application Framework アプリケーション開発ガイド
![[目次]](FIGURE/CONTENT.GIF)
![[索引]](FIGURE/INDEX.GIF)
![[前へ]](FIGURE/FRONT.GIF)
10.2.1 外部定義関数のクラスの実装
外部定義関数を実装するクラスファイルは,次の規則に従って作成してください。
- 使用できるフィールド
外部定義関数を実装するクラスで,staticフィールドを使用できます。
staticフィールドの値は,同一のクエリグループ内で同じクラスファイルを使用する,すべての外部定義関数の使用個所で共有されます。ただし,クエリグループが異なる場合は,同じクラスファイルを使用してもstaticフィールドの値は個別に管理されます。
- パッケージ名,およびクラス名
パッケージ名,およびクラス名には,任意の名前を使用できます。
ただし,「jp.co.Hitachi.soft.sdp」から始まるパッケージ名は指定できません。
- コンストラクターの指定
外部定義関数を実装するクラスは,クエリ内で外部定義関数の使用個所ごとに,CQLの定義内容に一致するコンストラクターを使用して,クエリグループの登録・削除時にインスタンスを作成・破棄します。このため,次の条件を満たすように作成してください。
- クラスは,修飾子に必ずpublicを指定して作成してください。インスタンス化できない抽象クラス(abstract)や内部クラスは使用できません。
- コンストラクターは,修飾子に必ずpublicを指定し,CQLで指定する初期化パラメーターの数およびデータ型が一致するように作成してください。
ただし,プリミティブ型を引数とするコンストラクターは使用できません。
なお,CQLで初期化パラメーターを省略する場合には,コンストラクターを作成しないでデフォルトコンストラクターを使用するか,または引数を持たないコンストラクターを作成してください。
これらの条件を満たしていない場合,外部定義関数を実装するクラスのインスタンスを生成できないため,クエリグループの登録でエラーになります。
- 実装するインタフェース
外部定義関数を実装するクラスは,SDPExternalStreamFunctionインタフェースを実装してください。SDPExternalStreamFunctionインタフェースは,次のメソッドを実装する必要があります。
- executeStreamFuncメソッド
このメソッドには,外部定義関数の処理を実装してください。
- initializeメソッド
このメソッドには,外部定義関数を実装するクラスが持つフィールドの初期設定など,関数実行前の初期化処理を実装してください。
- terminateメソッド
このメソッドには,外部定義関数を実装するクラスが持つフィールドのクリアなど,関数実行後の終了処理を実装してください。
SDPExternalStreamFunctionインタフェースの詳細については,「11.3 SDPExternalStreamFunctionインタフェース」を参照してください。
外部定義関数を実装するクラスファイルの注意事項を次に示します。
- 外部定義関数を実装するクラスファイルのパッケージ名を含むクラス名は,jvm_options.cfgのSDP_CLASS_PATHパラメーターに指定したクラスパスのクラスファイルと重複しないようにしてください。
重複した場合は,SDP_CLASS_PATHパラメーターに指定したクラスパスのクラスが優先して読み込まれるため,次に示すようなエラーが発生して外部定義関数が正しく動作しなくなるおそれがあります。
(例)
- SDPExternalStreamFunctionインタフェースの未実装,またはメソッドが存在しないなどの要因で,クエリグループの登録でエラーになる。
- SDP_CLASS_PATHパラメーターに指定したクラスパスのクラスのメソッドが外部定義関数として実行されてしまう。
- 外部定義関数を実装するクラスの中で,自身のクラスパス以外のクラスパスにあるクラスを参照している場合は,jvm_options.cfgのSDP_CLASS_PATHパラメーターにそのクラスパスを指定してください。
指定しない場合は,参照個所がフィールドやコンストラクターのときは,インスタンスの生成ができないため,クエリグループの登録でエラーになります。参照個所がメソッドのときは,そのメソッドの実行時に例外java.lang.NoClassDefFoundErrorが発生してクエリグループが閉塞します。
特に,次の場合には,クエリグループが閉塞し,クエリグループを削除しないと再開始できなくなるため注意してください。
- クエリグループの停止・閉塞またはputEndメソッドの処理の途中で実行する,terminateメソッドで例外が発生した。
- クエリグループの開始またはputEndメソッドの処理の途中で実行する,initializeメソッドで例外が発生した。
なお,jvm_options.cfgは,SDPサーバの起動後には変更できません。SDPサーバの起動前にjvm_options.cfgを編集してください。
- 外部定義関数を実装するクラスファイルのクラスパスは,jvm_options.cfgのSDP_CLASS_PATHパラメーターには指定しないでください。指定した場合は,次のようになるため注意してください。
- SDPサーバの起動中に,クラスやメソッドの変更を反映できなくなります。
- 外部定義関数を実装するクラスのstaticフィールドの値は,すべてのクエリグループで共有されます。
- 外部定義関数を実装するクラスの中で,標準出力および標準エラー出力への出力を行った場合,SDPサーバを実行しているJavaVMプロセスに出力します。また,相対パスでファイル参照などを行った場合は,運用ディレクトリからの相対パスとして扱います。
- 外部定義関数はクエリ実行中に呼び出されるため,外部定義関数の実行時間が長いほど,ストリームデータ処理システムの処理性能が低下します。また,単位時間当たりに処理できるタプル数が減り,入力ストリームキューでキューあふれが発生する要因にもなります。このため,最長でも10ミリ秒程度で外部定義関数の処理が完了するように実装することをお勧めします。
- 外部定義関数でJNIを使用する場合,外部定義関数の実装クラスとは別にネイティブライブラリのロード専用のJavaクラスを作成し,そのクラスパスをjvm_options.cfgのSDP_CLASS_PATHパラメーターに指定してください。外部定義関数実装クラス内でネイティブライブラリをロードすると,クエリの登録に失敗するおそれがあります。
All Rights Reserved. Copyright (C) 2010, 2014, Hitachi, Ltd.