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から処理される際、ハンドラへのコール順序は次のようになります。
-
初期化:
-
まず、ハンドラが構築されます。
-
次に、インスタンスでプロパティ・ファイルの値を使用してすべてのセッターがコールされます。
-
最後に、ハンドラが初期化されます。トランザクションを受信する前に
init(...)
メソッドがコールされます。init(...)
メソッドでsuper.init(...)
をコールして基底クラスを適切に初期化することが重要です。
-
-
その後、メタデータが受信されます。Javaモジュールが、この実行時にまだ出現していない表での操作を処理する場合、メタデータ・イベントが発行され、
metadataChanged(...)
メソッドがコールされます。通常は、このメソッドを実装する必要はありません。DsMetaData
は、新規データ・ソース・メタデータが受信されると自動的に更新されます。 -
トランザクションが開始されます。トランザクション・イベントが発行され、ハンドラで
transactionBegin(...)
メソッドが呼び出されます(これについては記載していません)。この時点ではトランザクションに操作がないため、これは通常使用されません。 -
操作が順次トランザクションに追加されます。これによって、各操作の追加のたびにハンドラで
operationAdded(...)
メソッドがコールされます。処理済のすべての表メタデータを含むデータ・ソース・メタデータとともに、これを含むトランザクションもメソッドに渡されます。トランザクションはまだコミットされておらず、コミットが受信される前に異常終了される可能性があります。各操作には、トランザクションから得た列値が含まれます(Extractが圧縮更新を処理する場合、変更された値のみの可能性があります)。列値には、ビフォア値とアフター値の両方が含まれることがあります。
ddlOperation
メソッドの場合、オプションは次のとおりです。-
opType
- 出現しているDDL操作タイプ(CREATE
、ALTER
など)を特定する列挙値です。 -
objectType
- DDLのターゲットのタイプ(TABLE
、VIEW
など)を特定する列挙値です。 -
objectName
- 完全修飾ソース・オブジェクト名です。一般には、完全修飾表名です。 -
ddlText
- ソース・リレーショナル・データベースで実行された未加工のDDLテキストです。
-
-
トランザクションがコミットされます。これによって、
transactionCommit(...)
メソッドがコールされます。 -
定期的に
reportStatus
がコールされます。プロセスの停止時にもコールされます。通常、これによって処理の統計が表示されます(処理された操作とトランザクションの数、およびその他の詳細)。
単純なプリンタ・ハンドラの例を次に示します。これは、単にトランザクション、操作およびメタデータについて非常に基本的なイベント情報を出力します。ハンドラには、出力ファイル名を設定するためのプロパティmyoutput
もあります。これは、Javaアプリケーション・プロパティ・ファイルで次のように設定できます。
gg.handlerlist=sample # set properties on 'sample' gg.handler.sample.type=sample.SampleHandler gg.handler.sample.myoutput=out.txt
カスタム・ハンドラを使用するには、次のようにします。
-
クラスをコンパイルします
-
クラスをアプリケーション・クラスパスに含めます。
-
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をカスタムのデータ型に変換することができます。
親トピック: カスタム・フィルタ、フォーマッタおよびハンドラの開発