9.4.5.3 Javaでのカスタム・ハンドラのコーディング

カスタム・ハンドラは、次の例で示すように、AbstractHandlerを拡張することで実装できます。

import oracle.goldengate.datasource.*;
import static oracle.goldengate.datasource.GGDataSource.Status;
public class SampleHandler extends AbstractHandler {
        @Override
        public void init(DsConfiguration conf, DsMetaData metaData) {
            super.init(conf, metaData);
            // ... do additional config...
        }
        @Override
        public Status operationAdded(DsEvent e, DsTransaction tx, DsOperation op) { ... }
        @Override
        public Status transactionCommit(DsEvent e, DsTransaction tx) { ... }
        @Override
        public Status metaDataChanged(DsEvent e, DsMetaData meta) { .... }
        @Override
        public void destroy() { /* ... do cleanup ... */ }
        @Override
        public String reportStatus() { return "status report..."; }
        @Override
        public Status ddlOperation(OpType opType, ObjectType objectType, String objectName, String ddlText) }

AbstractHandler内のメソッドは、抽象的ではなく、それどころか本体があります。本体では、それは、メタデータ・オブジェクトをダーティとマークすることで、キャッシュ済メタデータの無効化を実行します。また、ddlOperationメソッドが指定されている場合は、DDLイベントのTRACEレベル・ロギングを提供します。カスタム・ハンドラの実装では、このメソッドをオーバーライドできます。AbstractHandler内の機能が実行されることを確認するために、カスタム処理の前にスーパー・メソッドを必ずコールする必要があります。

トランザクションがExtractから処理される際、ハンドラへのコール順序は次のようになります。

  1. 初期化:

    • まず、ハンドラが構築されます。

    • 次に、インスタンスでプロパティ・ファイルの値を使用してすべてのセッターがコールされます。

    • 最後に、ハンドラが初期化されます。トランザクションを受信する前にinit(...)メソッドがコールされます。init(...)メソッドでsuper.init(...)をコールして基底クラスを適切に初期化することが重要です。

  2. その後、メタデータが受信されます。Javaモジュールが、この実行時にまだ出現していない表での操作を処理する場合、メタデータ・イベントが発行され、metadataChanged(...)メソッドがコールされます。通常は、このメソッドを実装する必要はありません。DsMetaDataは、新規データ・ソース・メタデータが受信されると自動的に更新されます。

  3. トランザクションが開始されます。トランザクション・イベントが発行され、ハンドラでtransactionBegin(...)メソッドが呼び出されます(これについては記載していません)。この時点ではトランザクションに操作がないため、これは通常使用されません。

  4. 操作が順次トランザクションに追加されます。これによって、各操作の追加のたびにハンドラでoperationAdded(...)メソッドがコールされます。処理済のすべての表メタデータを含むデータ・ソース・メタデータとともに、これを含むトランザクションもメソッドに渡されます。トランザクションはまだコミットされておらず、コミットが受信される前に異常終了される可能性があります。

    各操作には、トランザクションから得た列値が含まれます(Extractが圧縮更新を処理する場合、変更された値のみの可能性があります)。列値には、ビフォア値とアフター値の両方が含まれることがあります。

    ddlOperationメソッドの場合、オプションは次のとおりです。

    • opType - 出現しているDDL操作タイプ(CREATEALTERなど)を特定する列挙値です。

    • objectType - DDLのターゲットのタイプ(TABLEVIEWなど)を特定する列挙値です。

    • objectName - 完全修飾ソース・オブジェクト名です。一般には、完全修飾表名です。

    • ddlText - ソース・リレーショナル・データベースで実行された未加工のDDLテキストです。

  5. トランザクションがコミットされます。これによって、transactionCommit(...)メソッドがコールされます。

  6. 定期的にreportStatusがコールされます。プロセスの停止時にもコールされます。通常、これによって処理の統計が表示されます(処理された操作とトランザクションの数、およびその他の詳細)。

単純なプリンタ・ハンドラの例を次に示します。これは、単にトランザクション、操作およびメタデータについて非常に基本的なイベント情報を出力します。ハンドラには、出力ファイル名を設定するためのプロパティmyoutputもあります。これは、Javaアプリケーション・プロパティ・ファイルで次のように設定できます。

gg.handlerlist=sample
# set properties on 'sample'
gg.handler.sample.type=sample.SampleHandler
gg.handler.sample.myoutput=out.txt

カスタム・ハンドラを使用するには、次のようにします。

  1. クラスをコンパイルします

  2. クラスをアプリケーション・クラスパスに含めます。

  3. Javaアプリケーション・プロパティ・ファイルのアクティブ・ハンドラのリストにハンドラを追加します。

ハンドラをコンパイルするには、Java用Oracle GoldenGate JARをクラスパスに含め、コンパイルした.classファイルをgg_install_dir/javaue/resources/classesに配置します。

javac -d gg_install_dir/dirprm
-classpath ggjava/ggjava.jar SampleHandler.java

結果のクラス・ファイルは、次のようにresources/classesに(正しいパッケージ構造で)配置されます。

gg_install_dir/dirprm/sample/SampleHandler.class

ノート:

サンプルhello world以外のJavaアプリケーションの開発では、AntまたはMavenを使用してアプリケーションをコンパイル、テストおよびパッケージ化します。javacを示した例は、例示目的のみです。

あるいは、カスタム・クラスをJARに含め、クラスパスに含めることができます。Javaプロパティを使用してカスタムJARファイルをJVMクラスパスに含める(jvm.bootoptionsプロパティでjava.class.pathを使用)か、Javaアプリケーション・プロパティ・ファイルを設定してカスタムJARを含めます。

# set properties on 'one'
gg.handler.one.type=sample.SampleHandler
gg.handler.one.myoutput=out.txt
gg.classpath=/path/to/my.jar,/path/to/directory/of/jars/*

任意のハンドラで、追加の個別JAR、ディレクトリ(リソースまたは抽出したクラス・ファイルを含む)またはJARのディレクトリ全体を含めるようクラスパス・プロパティを設定できます。JARのディレクトリ全体を含めるには、Java 6形式の構文を使用します。

c:/path/to/directory/* (or on UNIX: /path/to/directory/* )

ワイルドカード*のみ指定できます。ファイル・パターンは使用できません。これは、.jar接尾辞で終わるディレクトリ内のすべてのファイルに自動的に一致します。複数のJARまたは複数のディレクトリを含めるには、システム固有のパス・セパレータ(UNIXではコロン、Windowsではセミコロン)を使用するか、前述の例で示したようにプラットフォームに依存しないカンマを使用します。

ハンドラに多数のプロパティを設定する必要がある場合、パラメータ・ファイルにプロパティを含めるだけで、ハンドラの対応するセッターがコールされます。たとえば:

gg.handler.one.type=com.mycompany.MyHandler
gg.handler.one.myOutput=out.txt
gg.handler.one.myCustomProperty=12345

前述の例では、カスタム・ハンドラ内の次のメソッドが起動されます。

public void setMyOutput(String s) {
        // use the string...
} public void setMyCustomProperty(int j) {
        // use the int...
}

int、long、String、booleanなど、任意の標準Javaデータ型を使用できます。カスタム・データ型の場合、カスタム・プロパティ・エディタを作成して、Stringをカスタムのデータ型に変換することができます。