JMS リスナーの定義

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

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

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

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

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

オプション (a) の動作例: クライアントは、 SELECT * FROM internet_inc WHERE iinc_id = 1 などのメッセージを JMS サーバーに送信します。JMS サーバーはこのメッセージを Virtual DataPort に転送します。Virtual DataPort は JMS サーバーに応答を返送しますが、選択した出力が 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 を受信すると、サーバーは次のクエリを実行します。

SELECT * FROM incidents
WHERE taxid = 'B78596014'

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

次の図には、JMS リスナーを扱うさまざまなコマンドの構文が含まれています。

CREATE LISTENER JMS ステートメントの構文
CREATE [ OR REPLACE ] LISTENER JMS <name:identifier>
    VENDOR { ACTIVEMQ | WEBSPHEREMQ | JNDI }
    DESTINATION = <name:literal>
    [ IGNOREREPLYTO ]
    [ REPLYTO = <name:literal> ]
    { QUEUE | TOPIC }
    OUTPUT = { XML | JSON }
    [ USER = <name:literal> PASSWORD = <name:literal> ]
    VDPUSER = <name:literal>
    [
      MESSAGESCONTAINVARIABLE = { TRUE | FALSE }
      QUERY = <query:literal>
    ]
    ENABLED = { TRUE | FALSE }
    PROPERTIES ( <property> [, <property> ]* )
    [ FOLDER = <folder:literal> ]
    [ DESCRIPTION = <description:literal> ]

<property> ::=
    <key:literal> = <value:literal>
  • VENDOR 。このリスナーが接続する JMS サーバーが Apache Active MQ と IBM WebSphere MQ のどちらでもない場合は、値 JNDI を使用します。

  • DESTINATION は、Virtual DataPort がサブスクライブして、リクエストを待機する、キューまたはトピックの名前です。

    JMS サーバーのベンダーによっては、サブスクライブ先を作成しなければならない場合があります。そうでない場合は、リスナーがサブスクライブしようとしたときに、サブスクライブ先が自動的に作成されます。

  • REPLYTO は、応答が返される JMS キューまたはトピックの名前です。

    JMS メッセージに [Reply to] フィールドが含まれていても、応答は常にこの宛先に送信されます。

    REPLYTO 句が指定されていない場合は、JMS リクエストの [Reply to] フィールドで指定されている宛先に応答が送信されます。

    JMS リクエストにもこのフィールドがない場合、サーバーは応答を返しません。

    IGNOREREPLYTO 句が指定されている場合、リスナーは応答を決して返しません。

  • QUEUE または TOPIC 。このリスナーのコネクション先の種類に応じて、いずれかのパラメーターを指定します。

  • OUTPUT 。このパラメーターが XML の場合、リスナーの出力は XML ドキュメントになります。 JSON の場合は、JSON ドキュメントになります。

  • USER および PASSWORD 。JMS サーバーにアクセスするための資格情報。

  • VDPUSER は、リスナーがクエリを実行するための十分な権限を持っているかどうかを確認するために、Virtual DataPort が使用するユーザー名です。Virtual DataPort サーバーにユーザーが 2 名登録されている例を以下に示します。

    • admin: 「管理者」、またはデータベースの任意のビューにアクセスすることのできる、データベースの「ローカル管理者」に昇格したユーザー。

    • user1: このデータベースに対する EXECUTE 権限だけを持つ「一般ユーザー」。

    VDPUSER パラメーターが「admin」の場合、リスナーは任意のクエリを実行できます。しかし、 VDPUSERuser1 の場合は、 CREATEDROPINSERTUPDATE 、および DELETE クエリは失敗します。なぜなら、 user1EXECUTE 権限だけを持つからです。

  • MESSAGESCONTAINVARIABLE および QUERY: これらが指定され、 MESSAGESCONTAINVARIABLEtrue の場合、リスナーが JMS メッセージを受信すると、サーバーは QUERY の変数 @JMSEXPRESSION を JMS メッセージの内容に置き換えます。その後、サーバーは、置換後のクエリを実行します。

  • ENABLEDTRUE の場合、リスナーが有効になります。つまり、リスナーの作成後、そのリスナーはリクエストを待機するために JMS サーバーへのコネクションを試みます。 FALSE の場合、リスナーは無効になります。

  • PROPERTIES 。JMS サーバーへのコネクションを取得するために使用されるプロパティのリスト。最も普及しているベンダー製品へのコネクションに必要なプロパティのリストについては、管理ガイドの付録「 JMS コネクションの詳細: JNDI プロパティ 」で説明しています。通常、JMS リスナーには、少なくとも以下のプロパティが必要になります。

    • java.naming.factory.initial (javax.naming.Context.INITIAL_CONTEXT_FACTORY)

    • java.naming.provider.url (javax.naming.Context.PROVIDER_URL)

    • transport.jms.ConnectionFactoryJNDIName 。JMS サーバーの JNDI コンテキストでのコネクションファクトリーの名前。

  • FOLDER 。リスナーが格納されるフォルダーのパス。例: FOLDER = '/jms listeners'

  • DESCRIPTION 。リスナーの説明。

JMS リスナーを有効または無効にするコマンド: ALTER LISTENER JMS
ALTER LISTENER JMS <name:identifier>
ENABLED EQ { true \| false }

ENABLED = TRUE で、以前は FALSE だった場合は、リクエストを待機するために JMS サーバーへのコネクションを試みます。

ENABLED = FALSE で、以前は TRUE だった場合は、JMS サーバーとのコネクションを閉じます。

JMS リスナーの名前を変更するには、次のような RENAME ステートメントを使用します。

RENAME LISTENER JMS の構文
RENAME LISTENER JMS <name:identifier> TO <new name:identifier>
例:
RENAME LISTENER JMS jms_listener_order TO jms_order_full;