JMS リスナー

Virtual DataPort は、JMS (Java Message Service (JMS)) サーバーにサブスクライブして、リクエストをリッスンできます。そのため、クライアントは、JDBC、ODBC、または Web サービスを介して Virtual DataPort に接続する代わりに、JMS サーバーにリクエストを送信できます。JMS サーバーは、受け取ったリクエストを Virtual DataPort に転送します。その後、Virtual DataPort からの応答が JMS サーバーのキューまたはトピックに返され、クライアントに転送されます。

初めて JMS リスナーを作成する場合、使用する JMS サーバーのクライアント jar をインストールします。その手順については、『インストールガイド』の「 JMS コネクターをインストールしての、SOAP Over JMS を使用する JMS リスナーと Web サービスの作成 」を参照してください。

JMS リスナーを作成するときは、次の処理を実行できるよう設定できます。

  • JMS サーバーから受信した VQL ステートメントを実行する。

  • JMS リスナーで補間変数 (@JMSEXPRESSION) を使用するクエリを定義して、実行時にこの変数を JMS サーバーから受信した値で置き換える。

JMS リスナーの出力は、 XML ドキュメントまたは JSON ドキュメントのいずれかを選択できます。

オプション a) の動作例: クライアントが SELECT * FROM internet_inc WHERE iinc_id=1 のようなメッセージを JMS サーバーに送信すると、JMS サーバーはこれを Virtual DataPort に転送します。Virtual DataPort はその応答を、XML 出力が選択されている場合は「 XML response message sent by a JMS listener 」に示すような形式で、JSON 出力が選択されている場合は「 JSON response message sent by a JMS listener 」に示すような形式で、それぞれ返信します。

JMS リスナーが返信する XML 応答メッセージ
<?xml version="1.0" encoding="UTF-8"?>
<response>
    <item>
        <iinc_id>1.00</iinc_id>
        <summary>Error in ADSL router</summary>
        <ttime>29-jun-2005 19h 19m 41s</ttime>
        <taxid>B78596011</taxid>
        <specific_field1>1</specific_field1>
        <specific_field2>1</specific_field2>
    </item>
</response>
JMS リスナーが返信する JSON 応答メッセージ
[{
   "IINC_ID": 1,
   "SUMMARY": "Error in ADSL router",
   "TTIME": "2005-06-29",
   "TAXID": "B78596011",
   "SPECIFIC_FIELD1": "1",
   "SPECIFIC_FIELD2": "1"
}]

リクエストが ALTER VIEW incidents CACHE INVALIDATE のような DML 文である場合、応答は空です (「 XML response message to a DML query 」と「 JSON response message to a DML query 」を参照)。

DML クエリに対する XML 応答メッセージ
<?xml version="1.0" encoding="UTF-8"?>
<response />
DML クエリに対する JSON 応答メッセージ
[]

オプション b) の動作例: 以下のクエリを使用して JMS リスナーを作成したとします。

JMS リスナーで定義されているサンプルクエリ
SELECT *
FROM incidents
WHERE taxid = '@JMSEXPRESSION'

リスナーが B78596014 のような値を受信すると、サーバーは以下のクエリを実行します。

JMS リスナーで定義されているサンプルクエリ
SELECT *
FROM incidents
WHERE taxid = 'B78596014'

JMS リスナーで定義されているクエリに @JMSEXPRESSION 変数が含まれない場合、リスナーから受信した値は無効にされて、クエリは「そのままの形で」実行されます。

高度な JMS 構成

Denodo JMS リスナーによる JMS メッセージの処理方法を制御するさまざまな構成オプションが用意されています。

これらのオプションはすべて <DENODO_HOME>/conf/vdp/VDBConfiguration.properties で構成されている必要があり、Virtual DataPort サーバーを再起動する必要があります。

受信確認モード

この JMS ドキュメント で定義されている JMS メッセージ受信確認モードは、 com.denodo.jms.acknowledgeMode プロパティで構成できます。このプロパティは、以下の値のいずれかに設定する必要があります。

  1. AUTO_ACKNOWLEDGE (デフォルト値)

  1. CLIENT_ACKNOWLEDGE

  2. DUPS_OK_ACKNOWLEDGE

「クエリ完了時受信確認」と「シリアル化処理」

「クエリ完了時受信確認」モードが有効な場合、JMS リスナーは、メッセージに関連付けられているクエリが完了した後にのみメッセージの受信を確認します。

「クエリ完了時受信確認」モードは、デフォルトでは無効です。これを有効にするには、以下を実行します。

SET 'com.denodo.jms.acknowledgeMode'='CLIENT_ACKNOWLEDGE';
SET 'com.denodo.jms.acknowledgeOnQueryFinish'='true';

特定のリスナーで「クエリ完了時受信確認」を有効または無効にするには、以下を実行します。

SET 'com.denodo.jms.acknowledgeOnQueryFinish.<database of the JMS listener>.<name of the JMS listener>'='<boolean>';

特定のリスナーでこれを無効にするには、このプロパティの値を false にする必要があります。特定のリスナーでこれを有効にするには、このプロパティを true に設定します。

「クエリ完了時受信確認」を有効/無効にする例

特定の 2 つを除くすべてのリスナーで「クエリ完了時受信確認」を有効にする
SET 'com.denodo.jms.acknowledgeMode'='CLIENT_ACKNOWLEDGE';
SET 'com.denodo.jms.acknowledgeOnQueryFinish'='true';
SET 'com.denodo.jms.acknowledgeOnQueryFinish.customer360.jms_orders_queue'='false';
SET 'com.denodo.jms.acknowledgeOnQueryFinish.customer360_development.jms_orders_queue_v2'='false';
1 つのリスナーでのみ「クエリ完了時受信確認」を有効にする
SET 'com.denodo.jms.acknowledgeMode'='CLIENT_ACKNOWLEDGE';
SET 'com.denodo.jms.acknowledgeOnQueryFinish'='false';
SET 'com.denodo.jms.acknowledgeOnQueryFinish.customer360.jms_orders_queue'='true';
特定のデータソースの「クエリ完了時受信確認」設定を削除する
SET 'com.denodo.jms.acknowledgeOnQueryFinish.customer360.jms_orders_queue' = NULL;

この場合、データソース jms_orders_queue は、「クエリ完了時受信確認」のデフォルト構成を使用します。


「シリアル化処理」モードが有効な場合、JMS リスナーは、一度に 1 つの JMS メッセージのみ処理します。

「シリアル化処理」モードは、デフォルトでは無効です。これを有効にするには、以下を実行します。

SET 'com.denodo.jms.serializeMessageProcessing'='true';

特定のリスナーで「シリアル化処理」を有効または無効にするには、以下を実行します。

SET 'com.denodo.jms.serializeMessageProcessing.<database of the JMS listener>.<name of the JMS listener>'='<boolean>';

特定のリスナーでこれを無効にするには、このプロパティの値を false にする必要があります。特定のリスナーでこれを有効にするには、このプロパティを true に設定します。

「シリアル化処理」を有効/無効にする例

特定の 2 つを除くすべてのリスナーで「シリアル化処理」を有効にする
SET 'com.denodo.jms.serializeMessageProcessing'='true';
SET 'com.denodo.jms.serializeMessageProcessing.customer360.jms_orders_queue'='false';
SET 'com.denodo.jms.serializeMessageProcessing.customer360_development.jms_orders_queue_v2'='false';
1 つのリスナーでのみ「シリアル化処理」を有効にする
SET 'com.denodo.jms.serializeMessageProcessing'='false';
SET 'com.denodo.jms.serializeMessageProcessing.customer360.jms_orders_queue'='true';
特定のデータソースの「シリアル化処理」設定を削除する
SET 'com.denodo.jms.serializeMessageProcessing.customer360.jms_orders_queue' = NULL;

この場合、データソース jms_orders_queue は、「シリアル化処理」のデフォルト構成を使用します。


JMS リスナーがサブスクライブしているキュー内のすべてのメッセージを Virtual DataPort で確実に実行する必要がある場合、両方のモード (「クエリ完了時受信確認」と「シリアル化処理」) を有効にすると役に立ちます。

特定のキュー内のメッセージによって多数のクエリが定義されていて、できる限り早くそのキューを空にする必要がある場合、「シリアル化処理」のみを有効にするという方法があります (「クエリ完了時受信確認」は有効にしない)。この場合、キュー内のメッセージによって定義されているすべてのクエリが実際に Virtual DataPort によって実行されることは保証されません。

JMS リスナーの高度なログの有効化

JMS リスナーの高度なログを有効にできます。これにより、JMS メッセージが発行したクエリが失敗した場合、以下の情報がログに記録されます。

  1. メッセージを受信する JMS リスナー

  1. JMS メッセージメタデータ (ID、タイムスタンプなど)

  2. リスナーによって実行された VQL クエリ

  3. 取得したエラー

JMS リスナーの高度なログを有効にするには、以下の手順に従って実行してください。

  1. Virtual DataPort を停止します。

  2. エディターで <DENODO_HOME>/conf/vdp/log4j2.xml を開きます。

  3. 以下のように新しいアペンダーを追加します (<DENODO_HOME> を実際のパスで置き換える)。

    JMSOUT アペンダー
    <RollingFile name="JMSOUT"
                 fileName="<DENODO_HOME>/logs/vdp/vdp-jms${env:vdp.instance.log}.log"
                 filePattern="<DENODO_HOME>/logs/vdp/vdp-jms${env:vdp.instance.log}.log.%i">
           <Policies>
                 <SizeBasedTriggeringPolicy size="10 MB" />
           </Policies>
           <DefaultRolloverStrategy max="7" />
           <PatternLayout pattern="%-4r [%t] %d{yyyy-MM-dd'T'HH:mm:ss.SSS} %x -\t%m  %n" />
    </RollingFile>
    
  1. 新しいロガーを追加します。

    com.denodo.jms.verbose logger
    <Logger name="com.denodo.jms.verbose" level="debug" additivity="false" >
           <AppenderRef ref="JMSOUT" />
    </Logger>
    
  2. Virtual DataPort を起動します。

これ以降、リスナーは <DENODO_HOME>/logs/vdp/vdp-jms.log に詳細なログを記録します。