18 Java Message Serviceハンドラの使用

Java Message Service (JMS)ハンドラを使用すると、証跡ファイルの操作をメッセージにフォーマットし、Oracle Weblogic Server、Websphere、ActiveMQなどのJMSプロバイダに公開できます。

この章では、JMSハンドラの使用方法について説明します。

18.1 概要

Java Message Serviceは、アプリケーションでメッセージの作成、送信、受信および読取りを行うことができるJava APIです。JMS APIでは、Javaプログラミング言語で記述されたプログラムが他のメッセージング実装と通信できるように、共通する一連のインタフェースおよび関連するセマンティクスを定義します。

JMSハンドラは、Oracle GoldenGateの証跡を取得し、それらのメッセージを構成されているJMSプロバイダに送信します。

18.2 JMSハンドラの設定および実行

JMSハンドラの設定(JNDI構成)は、使用するJMSプロバイダによって異なります。

次の各項では、JMSハンドラのコンポーネントの構成およびこのハンドラの実行の手順について説明します。

実行時の前提条件

JMSプロバイダは、起動および実行されていて、必要なConnectionFactoryQueueConnectionFactoryおよびTopicConnectionFactoryが構成されている必要があります。

セキュリティ

使用するJMSプロバイダに応じてSSLを構成します。

18.2.1 クラスパス構成

JMSハンドラ・プロパティ・ファイルは、Oracle GoldenGate dirprmディレクトリに保存することをお薦めします。

JMSハンドラを実行するには、JMSプロバイダ・クライアントJARがクラスパスに存在している必要があります。また、Java 8では、Java EE仕様クラスがJDKから独立したプロジェクトに移動されました。JMSはJava EE仕様の一部であるため、Java EE仕様jarは追加の依存性です。jarのダウンロードの詳細は、JMS依存性を参照してください。

プロバイダ・クライアントJARの場所は次のように指定します。

gg.classpath= path_to_the_providers_client_jars

18.2.2 Java Naming and Directory Interfaceの構成

Java Naming and Directory Interface (JNDI)プロパティを構成して初期コンテキストに接続し、接続ファクトリと初期宛先を参照します。

表18-1 JNDI構成プロパティ

プロパティ 必須/オプション 有効な値 デフォルト 説明

java.naming.provider.url

必須

有効なプロバイダURL (ポートを含む)

なし

ハンドラがサーバー上のオブジェクトを参照するために使用するURLを指定します。たとえば、t3://localhost:7001、またはSSLが有効な場合はt3s://localhost:7002です。

java.naming.factory.initial

必須

初期コンテキスト・ファクトリ・クラス名

なし

新しい初期コンテキスト・オブジェクトの作成時に使用する初期コンテキスト・ファクトリを指定します。Oracle WebLogic Serverの場合、値はweblogic.jndi.WLInitialContextFactoryです。

java.naming.security.principal

必須

有効なユーザー名

なし

使用するユーザー名を指定します。

java.naming.security.credentials

必須

有効なパスワード

なし

ユーザーのパスワードの指定

18.2.3 ハンドラ構成

JMSハンドラの操作は、プロパティ・ファイルを使用して構成します。これらのプロパティは、Javaアダプタ・プロパティ・ファイルにあります(Replicatプロパティ・ファイルにはありません)。

JMSハンドラの選択を有効にするには、まずgg.handler.name.type=jmsおよびその他のJMSプロパティを次のように指定してハンドラ・タイプを構成する必要があります。

表18-2 JMSハンドラの構成プロパティ

プロパティ 必須/オプション 有効な値 デフォルト 説明

gg.handler.name.type

必須

JMS

なし

トランザクション、操作およびメタデータをフォーマットされたメッセージとしてJMSプロバイダに送信するには、jmsを設定します。jms_mapに設定すると、JMSマップ・メッセージが送信されます。

gg.handler.name.destination

必須

有効なキューまたはトピックの名前

なし

メッセージが送信されるキューまたはトピックを設定します。これは、JMSサーバーで適切に構成される必要があります。たとえば、queue/Aqueue.Testexample.MyTopicなどです。

gg.handler.name.destinationType

オプション

queue | topic

queue

ハンドラがキューに送信する(単一受信者)か、トピックに送信する(パブリッシュ/サブスクライブ)かを指定します。gg.handler.name.queueOrTopicプロパティは、このプロパティの別名です。queueを設定すると、メッセージは読取り後にキューから削除されます。topicを設定すると、メッセージが公開され、複数のサブスクライバに配信できます。

gg.handler.name.connectionFactory

必須

有効な接続ファクトリ名

なし

JNDIを使用して検索する接続ファクトリの名前を指定します。gg.handler.name.ConnectionFactoryJNDINameプロパティは、このプロパティの別名です。

gg.handler.name.useJndi

オプション

true | false

true

falseに設定すると、JNDIはJMSクライアントの構成に使用されません。かわりに、ファクトリおよび接続が明示的に構築されます。

gg.handler.name.connectionUrl

オプション

有効な接続URL

なし

JNDIを使用せずに接続を明示的に作成する場合にのみ指定します。

gg.handler.name.connectionFactoryClass

オプション

有効なconnectionFactoryClass

なし

JNDIを使用しない場合にのみ、ファクトリにアクセスするために設定します。このプロパティの値はインスタンス化するJavaクラス名であり、ファクトリ・オブジェクトが明示的に構築されます。

gg.handler.name.physicalDestination

オプション

JNDIプロバイダではなくConnectionFactory APIから取得した、キューまたはトピック・オブジェクトの名前

なし

JMSがJNDIを使用するように構成されている場合、物理的な宛先は重要です。ConnectionFactoryはJNDI参照によって解決されます。物理的な宛先を設定するということは、JNDIを呼び出すかわりにConnectionFactoryでメソッドを呼び出すことによって、queueまたはtopicが解決されるということです。

gg.handler.name.user

オプション

有効なユーザー名

なし

JMSサーバーにメッセージを送信するためのユーザー名。

gg.handler.name.password

オプション

有効なパスワード

なし

JMSサーバーにメッセージを送信するためのパスワード

gg.handler.name.sessionMode

オプション

auto | client | dupsok

auto

JMSセッション・モードを設定します。これらの値は標準のJMS値と同等と見なされます。

Session.AUTO_ACKNOWLEDGE

セッションが受信のためのコールから正常に戻ったとき、またはセッションがメッセージを正常に処理するためにコールしたメッセージ・リスナーが正常に戻ったとき、セッションはクライアントがメッセージを受信したことを自動的に確認します。

Session.CLIENT_ACKNOWLEDGE

クライアントは、メッセージの確認応答メソッドをコールして、消費されたメッセージを確認します。

Session.DUPS_OK_ACKNOWLEDGE

この確認モードは、メッセージの配信をゆるやかに確認するようにセッションに指示します。

gg.handler.name.localTX

オプション

true | false

true

メッセージの送信時にローカル・トランザクションを使用するかどうかを設定します。単一のメッセージを一度に1つずつ送信およびコミットしていないかぎり、ローカル・トランザクションはデフォルトで有効になっています。ローカル・トランザクションを無効にする場合は、falseに設定します。

gg.handler.name.persistent

オプション

true | false

true

配信モードを永続または非永続に設定します。メッセージが永続の場合、クライアントの送信操作の一環としてメッセージを安定的なストレージに記録するようJMSプロバイダを構成する必要があります。

gg.handler.name.priority

オプション

0から10までの有効な整数

4

JMSサーバーで、0を最低、9を最高とする10段階の優先度の値が定義されます。

gg.handler.name.timeToLive

オプション

時間(ミリ秒)

0

生成されたメッセージがメッセージ・システムによって保持される時間のディスパッチ時間からの長さ(ミリ秒)を設定します。ゼロに設定すると、時間は無制限になります。

gg.handler.name.custom

オプション

oracle.goldengate.messaging.handler.GGMessageLifeCycleListenerを実装するクラス名

なし

メッセージが配信される前にメッセージにプロパティを設定できるように、メッセージ・リスナーを構成します。

gg.handler.name.format

オプション

xml | tx2ml | xml2 | minxml | csv | fixed | text | logdump | json | json_op | json_row | delimitedtext | Velocity template

delimitedtext

操作およびトランザクションをJMSサーバーに送信されるメッセージに変換するために使用するフォーマットを指定します。

velocityテンプレートはテンプレート・ファイルの場所を指している必要があります。サンプルはAdapterExamples/java-delivery/sample-dirprm/の下にあります。

例: format_op2xml.vm

<$op.TableName sqlType='$op.sqlType' 
opType='$op.opType' txInd='$op.txState' 
ts='$op.Timestamp' numCols='$op.NumColumns' 
pos='$op.Position'>
#foreach( $col in $op )
#if( ! $col.isMissing())
 <$col.Name colIndex='$col.Index'>
#if( $col.hasBefore())
#if( $col.isBeforeNull())
<before><isNull/></before>
#else
<before><![CDATA[$col.before]]></before>
#{end}## if col has 'before' value
#{end}## if col 'before' is null
#if( $col.hasValue())
#if( $col.isNull()) 
<after><isNull/></after>
#{else}
 <after><![CDATA[$col.value]]></after>
#{end}## if col is null
#{end}## if col has value 
</$col.Name>
#{end}## if column is not missing
#{end}## for loop over columns
 </$op.TableName> 

gg.handler.name.includeTables

オプション

有効な表名のリスト

なし

ハンドラによって含められる表のリストを指定します。

表のスキーマ(または所有者)が指定されている場合は、そのスキーマのみが表名と一致します。それ以外の場合、表名は任意のスキーマに一致します。表のカンマ区切りのリストを指定できます。たとえば、ハンドラに表foo.customerおよびbar.ordersのみを処理させるには、次のようにします。

表のカタログとスキーマ(または所有者)が指定されている場合、そのカタログとスキーマのみが表名と一致します。それ以外の場合、表名は任意のカタログおよびスキーマに一致します。表のカンマ区切りのリストを指定できます。たとえば、ハンドラに表dbo.foo.customerおよびdbo.bar.ordersのみを処理させるには、次のようにします。

いずれかの表が含める表のリストと一致する場合は、そのトランザクションが含められます。

指定された表名のリストでは、大文字と小文字が区別されます。

gg.handler.name.excludeTables

オプション

有効な表名のリスト

なし

ハンドラによって除外される表のリストを指定します。

表単位で表での操作を選択的に処理するには、ハンドラは操作モードで処理している必要があります。ハンドラがトランザクション・モードで処理されていて、1つのトランザクションに複数の表にまたがる複数の処理が含まれている状況では、いずれかの表が除外する表のリストと一致する場合、そのトランザクションは除外されます。

指定された表名のリストでは、大文字と小文字が区別されます。

gg.handler.name.mode

オプション

op | tx

op

1メッセージ当たり1つの操作を出力する(op)か、1メッセージ当たり1つのトランザクションを出力する(tx)か指定します。

18.2.4 Oracle WebLogic Serverを使用した構成のサンプル

java.naming.provider.url=t3://localhost:7001
java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
java.naming.security.principal=weblogic
java.naming.security.credentials=Welcome
gg.handler.myjms1.type=jms
gg.handler.myjms1.destination=myq
gg.handler.myjms1.connectionFactory=mycf
gg.handler.myjms1.format=xml