10.3. JDBC データベースを使用したメッセージングジャーナルの永続化

デフォルトのファイルベースのジャーナルを使用するのではなく、JDBC を使用してメッセージを永続化し、データをデータベースにバインドするように、JBoss EAP 7 メッセージングを設定できます。この設定を行うには、まず datasources サブシステムの datasource 要素を設定し、次に messaging-activemq サブシステムの server 要素で journal-datasource 属性を定義して、データソースを使用する必要があります。journal-datasource 属性が存在すると、ファイルベースのジャーナルではなくジャーナルエントリーをデータベースに永続化することを、メッセージングサブシステムに通知します。messaging -activemq サブシステムの server リソースの journal-database 属性は、データベースとの通信に使用される SQL ダイアレクトを定義します。これはデータソースメタデータを使用して自動的に設定されます。

メッセージをファイルベースのジャーナルに永続化すると、大きいメッセージのサイズはディスクのサイズによってのみ制限されます。ただし、メッセージをデータベースに永続化すると、大きなメッセージのサイズは、そのデータベースの BLOB データ型の最大サイズに制限されます。

10.3.1. メッセージングジャーナル JDBC 永続ストアの設定

以下の手順に従って、JDBC を使用してメッセージを永続化し、データをデータベースにバインドするように、JBoss EAP 7 メッセージングを設定します。

  1. messaging-activemq サブシステムで使用するために、datasources サブシステムの datasource を設定します。データソースの作成と設定の方法の詳細は、JBoss EAP 設定ガイドデータソース管理 を参照してください。
  2. messaging-activemq サブシステムを設定して新しいデータソースを使用します。

    /subsystem=messaging-activemq/server=default:write-attribute(name=journal-datasource,value="MessagingOracle12cDS")

    これにより、サーバー設定ファイルの messaging-activemq サブシステムに以下の設定が作成されます。

    <server name="default">
      <journal datasource="MessagingOracle12cDS"/>
      ...
    </server>

JBoss EAP メッセージングが、データベースを使用してメッセージングデータを格納するように設定されました。

10.3.2. メッセージングジャーナルテーブル名の設定

JBoss EAP 7 メッセージングは、個別の JDBC テーブルを使用してバインディング情報、メッセージ、大容量メッセージ、ページング情報を格納します。これらのテーブルの名前は、サーバー設定ファイルの messaging-activemq サブシステムにある server リソースの journal-bindings-tablejournal-jms-bindings-tablejournal-messages-tablejournal-large-messages-table、および journal-page-store-table 属性を使用して設定できます。

テーブル名にはいくつかの制限があります。

  • JBoss EAP 7 メッセージングでは、TABLE_NAME + GENERATED_ID のパターンでページングテーブルの識別子を生成します。ここで GENERATED_ID は 20 文字まで可能です。Oracle Database 12c ではテーブル名の長さは最大 30 文字であるため、テーブル名を 10 文字に制限する必要があります。これを超えると、ORA-00972: identifier is too long というエラーが表示される可能性があり、ページングが機能しなくなります。
  • Oracle Database 12c の スキーマオブジェクトネーミング規則 に準拠しないテーブル名は、二重引用符で囲む必要があります。引用符付きの識別子は任意の文字で開始でき、任意の文字、句読点、スペースを含めることができます。ただし、引用符で囲まれていてもいなくても、識別子に二重引用符またはヌル文字 (\0) を含めることはできません。引用符で囲まれた識別子は、大文字と小文字が区別されることに注意してください。
  • 複数の JBoss EAP サーバーインスタンスが同じデータベースを使用してメッセージを永続化し、データをバインドする場合、テーブル名はサーバーインスタンスごとに一意である必要があります。複数の JBoss EAP サーバーは同じテーブルにアクセスできません。

以下の例は、引用符付き識別子を使用して journal-page-store-table 名を設定する管理 CLI コマンドです。

/subsystem=messaging-activemq/server=default:write-attribute(name=journal-page-store-table,value="\"PAGE_DATA\"")

これにより、サーバー設定ファイルの messaging-activemq サブシステムに以下の設定が作成されます。

<server name="default">
  <journal datasource="MessagingOracle12cDS" journal-page-store-table="&quot;PAGED_DATA&quot;"/>
  ...
</server>

10.3.3. 管理対象ドメインでのメッセージングジャーナルの設定

前述の メッセージングジャーナルテーブル名の設定 で説明したように、JDBC を使用してメッセージを永続化してデータをデータベースにバインドする場合は複数の JBoss EAP サーバーが同じデータベーステーブルにアクセスすることはできません。管理対象ドメインの場合、サーバーグループのすべての JBoss EAP サーバーインスタンスは同じプロファイル設定を共有します。このため、メッセージングジャーナル名またはデータソースを設定する式を使用する必要があります。

すべてのサーバーが、同じデータベースを使用してメッセージングデータを格納するように設定されている場合、テーブル名はサーバーインスタンスごとに一意にする必要があります。以下の例は、名前が一意のノード識別子を含む式を使用して、サーバーグループの各サーバーに対して一意の journal-page-store-table テーブル名を作成する管理 CLI コマンドです。

/subsystem=messaging-activemq/server=default:write-attribute(name=journal-page-store-table,value="${env.NODE_ID}_page_store")

各サーバーインスタンスが異なるデータベースにアクセスする場合、式を使用して各サーバーのメッセージング設定が異なるデータソースに接続するようにできます。以下の管理 CLI コマンドでは、connection-urlDB_CONNECTION_URL 環境変数を使用して、異なるデータソースに接続します。

data-source add --name=messaging-journal --jndi-name=java:jboss/datasources/messaging-journal --driver-name=oracle12c  --connection-url=${env.DB_CONNECTION_URL}

10.3.4. メッセージングジャーナルネットワークのタイムアウトの設定

JDBC コネクションがリクエストに応答するまでのデーターベースの待機時間の最大値 (ミリ秒単位) を設定できます。これは、ネットワークが停止するか、JBoss EAP メッセージングとデータベースの間の接続が何らかの理由が閉じられているイベントで役に立ちます。こうしたイベントが発生すると、タイムアウトになるまでクライアントはブロックされます。

journal-jdbc-network-timeout 属性を更新してタイムアウトの設定をします。デフォルト値は 20000 ミリ秒 (20 秒) です。

以下の例は、journal-jdbc-network-timeout 属性値を 10000 ミリ秒 (10 秒) に設定する管理 CLI コマンドです。

/subsystem=messaging-activemq/server=default:write-attribute(name=journal-jdbc-network-timeout,value=10000)

10.3.5. メッセージング JDBC 永続ストアの HA の設定

JBoss EAP の messaging-activemq サブシステムでは、ブローカーがデータベースストアタイプで設定されている場合、JDBC HA 共有ストア機能をアクティブにします。その後、ブローカーは共有データベーステーブルを使用して、ライブサーバーおよびバックアップサーバーが共有 JDBC ジャーナルストアのアクションを確実に連携させます。

以下の属性を使用すると、JDBC 永続ストアの HA の設定が可能となります。

  • journal-node-manager-store-table: ノードマネージャーを格納する JDBC データベーステーブルの名前。
  • journal-jdbc-lock-expiration: キープアライブすることなく JDBC ロックが有効とみなされる期間。デフォルトの値は 20000 ミリ秒です。
  • journal-jdbc-lock-renew-period: JDBC ロックのキープアライブサービスの時間。デフォルトの値は 2000 ミリ秒です。

デフォルト値は、サーバーの ha-policy 属性と journal-datasource 属性の値に基づいて考慮されています。

後方互換性を保つために、各 Artemis 固有のシステムプロパティーを使用して値を指定することもできます。

  • brokerconfig.storeConfiguration.nodeManagerStoreTableName
  • brokerconfig.storeConfiguration.jdbcLockExpirationMillis
  • brokerconfig.storeConfiguration.jdbcLockRenewPeriodMillis

これらのシステムプロパティーを設定すると、対応する属性のデフォルト値よりも優先されます。