プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Event Processingアプリケーションの開発
12c リリース1 (12.1.3)
E54312-04
目次へ移動
目次

前
前へ
次
次へ

14 テスト1-2-3

Oracle Event Processingには、対象と方法に応じて、アプリケーションをテストする様々な方法があります。

この章の内容は次のとおりです。

14.1 ロード・ジェネレータとcsvgenアダプタ

ロード・ジェネレータ・ユーティリティはデータ・フィードをシミュレートし、実際のデータ・フィードに接続せずにアプリケーションをテストできます。ロード・ジェネレータでアプリケーションをテストするには、アプリケーションでcsvgenアダプタを使用する必要があります。csvgenアダプタは、ロード・ジェネレータで生成されたデータ・パケットを復号化するよう特別にコーディングされているためです。

csvgenアダプタでアプリケーションのテストが終了したら、アダプタで説明しているように、アプリケーションに適した入力アダプタに置き換えることができます。

ロード・ジェネレータは、サンプル・データ・フィード情報を含むASCIIファイルを読み取り、ポート順に各行のデータを送信します。csvgenアダプタは同じポートでデータをリスニングします。

ロード・ジェネレータのプロパティ・ファイルに、データ・ファイルの名前、サーバーがリスニングするポート、サーバー・ホストおよびパケット・タイプを指定します。データ速度と、ロード・ジェネレータが指定した最終的な速度に達するまでの時間も設定できます。

次の手順では、ロード・ジェネレータ・ユーティリティの構成および実行方法の概要を示します。その後、各ステップの詳細を説明します。

  1. ロード・ジェネレータの特定の実行に関する構成プロパティを含むプロパティ・ファイルを作成します。Oracle Event Processingにはデフォルトのプロパティ値が適切である場合に使用できる、デフォルトのプロパティ・ファイルが用意されています。プロパティ・ファイルの作成を参照してください。

  2. 実際のデータ・フィード値が含まれたファイルを作成します。データ・フィード・ファイルの作成を参照してください。

  3. ロード・ジェネレータで生成されたデータ・フィードが正常に読み込まれるようにcsvgenアダプタを構成します。アプリケーションのcsvgenアダプタの構成を参照してください。

  4. ロード・ジェネレータを実行してステップ1で作成したプロパティ・ファイルを指定し、シミュレートされたデータ・フィードを開始します。たとえば、プロパティ・ファイル名がc:\loadgen\myDataFeed.propの場合は、次のコマンドを実行します。

    prompt> runloadgen.cmd c:\loadgen\myDataFeed.prop
    

    アプリケーションを再デプロイした場合は、ロード・ジェネレータも再起動する必要があります。

  5. ジェネレータを停止およびロードするには、ロード・ジェネレータが実行されているディレクトリに移動し、ctrl-cと入力します。

14.1.1 プロパティ・ファイルの作成

Oracle Event Processingには、csvgen.propという名前のデフォルトのプロパティ・ファイルが、/Oracle/Middleware/my_oep/utils/load-generatorディレクトリに用意されています。ファイルの形式は単純で、プロパティと値の各ペアが各行に置かれます。

次の例は、デフォルトのcsvgen.propファイルです。このファイルを独自のプロパティ・ファイルのテンプレートとして使用することをお薦めします。

# name of file containing your test data
  test.csvDataFile=test.csv
# port the server will listen on for client connection
  test.port=9001
# server host (localhost if not specified)
# test.host=
# do not change the packetType
  test.packetType=CSV

表14-1 ロード・ジェネレータのプロパティ

プロパティ 説明 データ型 必須かどうか

test.csvDataFile

データ・フィード値が含まれたファイルを指定します。

String

はい

test.port

ロード・ジェネレータがデータ・フィードを送信するポート番号。

各入力アダプタには、独自のtest.portを関連付ける必要があります。

Integer

はい

test.secs

load generatorの秒単位の実行時間。

デフォルト値は30です。

Integer

いいえ

test.rate

最終データ速度(毎秒のメッセージ数単位)。

デフォルト値は1です。

Integer

いいえ

test.startRate

初期データ速度(毎秒のメッセージ数単位)。

デフォルト値は1です。

Integer

いいえ

test.rampUpSecs

test.startRateからtest.rateに増加するまでの秒数。

デフォルト値は0です。

Integer

いいえ

14.1.2 データ・フィード・ファイルの作成

ロード・ジェネレータ・データ・フィード・ファイルは、Oracle Event Processingアプリケーションに登録されたイベント・タイプに対応するサンプルのデータ・フィード値を含みます。

次の例は、EmployeeEventおよびこのイベント・タイプに対応するロード・ジェネレータのデータ・フィード・ファイルを示します。

<wlevs:event-type-repository>
        <wlevs:event-type type-name="EmployeeEvent">
            <wlevs:properties>
                <wlevs:property name="name" type="char" />
                <wlevs:property name="age" type="int" />
                <wlevs:property name="birthplace" type="char" length="512" />
        </wlevs:properties>
    </wlevs:event-type>
...
</wlevs:event-type-repository>
 Lucy,23,Madagascar
 Nick,44,Canada
 Amanda,12,Malaysia
 Juliet,43,Spain
 Horatio,80,Argentina

ロード・ジェネレータのデータ・フィード・ファイルの形式は簡単です。

  • データ・フィードの各項目を各行に配置します。

  • データ・フィード項目の各フィールドをカンマで区切ります。

  • 文字列フィールドにカンマは含めないでください。

  • フィールド値の一部としてスペースが含まれているのでない限り、カンマの前後に余分なスペースを含めないでください。

  • 整数、long、doubleおよびfloatなどの、データ・フィード・ファイルの文字列データおよび数値データのみを含みます。

  • 文字列の長さを最大256文字までに収めるか、長い文字列長を指定します。長い文字列を指定するには、event-type内のbirthplaceプロパティについてcharプロパティのlength属性を設定します。

CSVアダプタの制約の詳細は、設計制約を参照してください。

14.1.3 アプリケーションのcsvgenアダプタの構成

ロード・ジェネレータ・ユーティリティを使用する場合、Oracle Event Processingで提供されるcsvgenアダプタは、ロード・ジェネレータで生成されたデータ・パケットを読み込むように特別にコーディングされているため、アプリケーションではこのアダプタを使用する必要があります。

すべてのアダプタと同じように、アプリケーションのEPNアセンブリ・ファイルのwlevs:adapter要素を使用して、csvgenアダプタを登録します。独自のアダプタのかわりにcsvgenアダプタをプロバイダとして指定するために、provide属性をcsvgenに設定します。また、次の子タグを指定する必要があります。

  • name属性portvalue属性configured_portがあるwlevs:instance-property要素。configured_portはロード・ジェネレータ・プロパティ・ファイルのtest.portプロパティに対応します。プロパティ・ファイルの作成を参照してください。

  • name属性のeventTypeNameおよびvalue属性のevent_type_nameのあるwlevs:instance-property要素。event_type_nameはload-generatedフィードの項目を表すイベント・タイプ名に対応します。

  • name属性のeventPropertyNamesおよびvalue属性のordered_list_of_propertiesのあるwlevs:instance-property要素。ordered_list_of_propertiesは、ロード・ジェネレータで送信されてcsvgenアダプタで受信される順番でプロパティ名をリストします。

アダプタの構成する方法を説明する前に、まず次に示すwlevs:metada要素を使用して、アプリケーションがEPNアセンブリ・ファイルに、PersonTypeと呼ばれるイベント・タイプを登録していると仮定します。

<wlevs:event-type-repository>
        <wlevs:event-type type-name="PersonType">
            <wlevs:properties>
               <wlevs:property name="name" type="char"/>
               <<wlevs:property name="age" type="int"/>
               <<wlevs:property name="birthplace" type="char"/>
            </wlevs:properties>
        </wlevs:event-type>
</wlevs:event-type-repository>

このイベント・タイプはデータ・フィード・ファイルの作成で説明しているデータ・フィード・ファイルに対応しています。

このデータを受信するcsvgenアダプタを構成するには、次のwlevs:adapter要素を使用します。

<wlevs:adapter id="csvgenAdapter" provider="csvgen">
   <wlevs:instance-property name="port" value="9001"/>
   <wlevs:instance-property name="eventTypeName" value="PersonType"/>
   <wlevs:instance-property name="eventPropertyNames" value="name,age,birthplace"/>
</wlevs:adapter>

アダプタ構成の例に示す太字部分の値がPersonTypeイベント・タイプの登録にどのように対応しているかに注意してください。

イベント・タイプの登録でwlevs:class要素を使用して独自のJavaBeanを指定した場合、eventPropertyNames値はJavaBeanのプロパティに対応します。たとえば、JavaBeanにgetNameメソッドが含まれている場合、JavaBeanのプロパティの中の1つはnameになります。

イベント・タイプの詳細は、イベントおよびイベント・タイプを参照してください。

14.2 イベント・インスペクタ・サービス

開発中にOracle CQL問合せのテストやデバッグを行うためにイベント・インスペクタ・サービスを使用します。イベント・インスペクタ・サービスを使用して、EPNステージから離れるイベントを表示(トレース)し、EPNステージにイベントをインジェクトできます。

イベント・インスペクタ・サービスは、共通HTTPパブリッシュ/サブスクライブ・チャネルとサーバーを使用してイベントをトレースおよびインジェクトします。

注:

本番Oracle Event Processingサーバーでは、イベント・インスペクタ・サービスを使用しないでください。このサービスは開発中にのみ使用します。

トレース・イベントのbinding属性はoutboundに設定する必要があり、インジェクトされるイベントのbinding属性はinboundに設定する必要があります。イベント・インスペクタ・クライアントを使用して次のようなイベントがインジェクトできます。

  • StockTickイベントなど、タイプによる単一のシンプルなイベント。使用可能な特定のイベント・プロパティ・タイプはクライアントに依存します。

  • JSON形式の文字列として単一イベントのHTTPパブリッシュ・サブスクライブ・チャネルへの直接インジェクトJSONが表現できる任意のイベント・プロパティを使用できます。

  • 1つ以上のJSON形式の文字列を含むファイルを使用した複数のイベントJSONが表現できる任意のイベント・プロパティを使用できます。イベント・インスペクタのサービス・クライアントがファイルを解析し、すべてのJSON文字列をHTTPパブリッシュ/サブスクライブ・チャネルにインジェクトします。

入力ファイルを作成するとき、JavaオブジェクトをJSON形式に変換するためにGSON Javaライブラリを使用できます。詳細は、次を参照してください。

イベント・インスペクタ・サービスは、Oracle Event Processing Visualizerをサポートします。『Oracle Event Processingビジュアライザの使用』のイベント・インスペクタ・サービス管理に関する項を参照してください。

14.2.1 イベント・タイプ

イベント・インスペクタ・サービスは、Oracle Event Processingのすべてのイベント・タイプ、すなわちJavaBeanクラス、Mapおよびタプルをサポートします。イベント・インスペクタ・サービスは、トレース・チャネルに公開する前にイベントをJavaScript Object Notation (JSON)形式に変換します。イベントはJSON形式でインジェクトする必要があります。

注:

イベント・インスペクタで使用されるイベント・タイプのプロパティ・タイプとして、バイト配列はサポートされていません。

JSON形式のイベントは構造に準拠している必要があります。表14-1は必要な属性を示します。

{
    "event-type": "myEventType",
    "operation": "insert",
    "binding": "outbound",
    "value":{
        "firstname": "Jane",
        "lastname": "Doe",
        "phone": {
            "code": 12345,
            "number": "office"
        },
    }
}

表14-2 イベント・インスペクタJSONイベントの必要な属性

属性 説明

event-type

アプリケーション・アセンブリ・ファイルのevent-type-repositoryで定義されたOracle Event Processingイベントの名前。

operation

イベントのタイプを指定します。

  • insert: 挿入イベント

  • delete: 削除イベント

  • update: 更新イベント

  • heartbeat: ハートビート・イベント

binding

次のいずれかです。

  • inbound: インジェクト・イベント

  • outbound: トレース・イベント

value

event-typeで定義された1つ以上のJSON形式のイベント・プロパティ。

14.2.2 HTTPパブリッシュ/サブスクライブ・チャネルおよびサーバー

イベント・インスペクタ・サービスは、サーバーconfig.xmlファイルで定義されている次の名前で、動的HTTPパブリッシュ/サブスクライブ(HTTP pub-sub)チャネルを使用します。

/SERVERNAME/APPLICATIONNAME/STAGENAME/DIRECTION

SERVERNAME: EPNステージが実行されているOracle Event Processingサーバーの名前。

APPLICATIONNAME: Oracle Event Processingアプリケーションの名前。

STAGENAME: EPNステージの名前。

DIRECTION: 次のいずれか:

  • input: イベント・インジェクション

  • output: イベント・トレース

次に例を示します。

/server-1/myapp/MyInputAdapter/input

イベント・インスペクタのサービスは、HTTPパブリッシュ/サブスクライブ・サーバーを使用します。次のいずれかになります。

  • ローカル: event-inspector要素でサーバー・ファイルを構成し、このマシンで実行中のローカル・パブリッシュ/サブスクライブ・サーバーの名前でpubsub-server-name子要素を構成します。

  • リモート: event-inspector要素でサーバー・ファイルを構成し、リモート・マシンで実行中のHTTPパブリッシュ/サブスクライブ・サーバーへのURLでpubsub-server-url子要素を構成します。

  • デフォルト: サーバー・ファイルで1つのみのHTTPパブリッシュ/サブスクライブ・サーバーが定義されていてローカルまたはリモートのHTTPパブリッシュ/サブスクライブ・サーバーが指定されていない場合、イベント・インスペクタ・サービスはデフォルトでローカルのHTTPパブリッシュ/サブスクライブ・サーバーを使用します。

イベント・インスペクタ・サービスは同じHTTPパブリッシュ/サブスクライブ・チャネルとサーバーを使用してイベントをトレースしインジェクトします。

14.2.3 ローカルまたはリモート・サーバーの構成

ローカルまたはリモートのHTTPパブリッシュ/サブスクライブ・サーバーでイベント・インスペクタ・サービスを構成できます。コンポーネント構成ファイルでイベント・インスペクタHTTPパブリッシュ/サブスクライブ・サーバーを構成します。サーバーにHTTPパブリッシュ/サブスクライブ・サーバーが1つのみ定義されていて、ローカルまたはリモートのHTTPパブリッシュ/サブスクライブ・サーバーが指定されていない場合、イベント・インスペクタ・サービスはデフォルトでローカルのHTTPパブリッシュ/サブスクライブ・サーバーを使用します。

ローカルHTTPパブリッシュ/サブスクライブ・サーバーのための構成

テストするコンポーネントを含むコンポーネント構成ファイルに対して、次のようにevent-inspectorname要素を追加します。

<event-inspector>
    <name>myEventInspectorConfig</name>
    <pubsub-server-name>myPubSub</pubsub-server-name>
</event-inspector>

pubsub-server-nameの値であるmyPubSubは、次の例のようにローカルOracle Event Processingサーバー・ファイルで定義されているhttp-pubsub要素のname子要素の値です。

<http-pubsub>
  <name>myPubSub</name>
  <path>/pubsub</path>
  <pub-sub-bean>
    <server-config>
      <supported-transport>
        <types>
          <element>long-polling</element>
        </types>
      </supported-transport>
      <publish-without-connect-allowed>true</publish-without-connect-allowed>
    </server-config>
    <channels>
        ...
    </channels>
  </pub-sub-bean>
</http-pubsub>

リモートHTTPパブリッシュ/サブスクライブ・サーバーのための構成

テストするコンポーネントを含むコンポーネント構成ファイルに対して、次のようにevent-inspectorname要素を追加します。

<event-inspector>
  <name>myEventInspectorTraceConfig</name>
  <pubsub-server-url>http://HOST:PORT/PATH</pubsub-server-url>
</event-inspector>

HOST: リモートOracle Event Processingサーバーのホスト名またはIPアドレスです。

PORT: リモートのOracle Event Processingサーバー・ファイルで定義されたリモートのOracle Event Processingサーバーnetioポートです。デフォルト: 9002

PATH: リモートのOracle Event Processingサーバー・ファイルで定義されたhttp-pubsub要素path子要素の値です。

次の例に示すhttp-pubsub構成の場合、有効なpubsub-server-urlは、次のようになります。

http://remotehost:9002/pubsub

pubsub-server-nameの値であるmyPubSubは、次の例のようにローカルOracle Event Processingサーバー・ファイルで定義されているhttp-pubsub要素のname子要素の値です。

<http-pubsub>
  <name>myPubSub</name>
  <path>/pubsub</path>
  <pub-sub-bean>
    <server-config>
      <supported-transport>
        <types>
          <element>long-polling</element>
        </types>
      </supported-transport>
      <publish-without-connect-allowed>true</publish-without-connect-allowed>
    </server-config>
    <channels>
          ...
    </channels>
  </pub-sub-bean>
</http-pubsub>

14.2.4 イベントのインジェクト

イベント・インスペクタ・サービスHTTPパブリッシュ/サブスクライブ・サーバーを構成した後、イベントをインジェクトするためにイベント・インスペクタ・クライアントを使用できます。イベント・インジェクションを構成するには、Oracle Event Processing Visualizerを使用するか、アプリケーションでコンポーネント構成ファイルを編集して、アプリケーションのデプロイ時または再デプロイ時に設定されるインジェクション設定を指定します。

Oracle Event Processing Visualizerで、アプリケーションの再デプロイ時に破棄できる設定でイベント・インジェクションを構成します。『Oracle Event Processingビジュアライザの使用』のイベントのインジェクトに関する項を参照してください。

アプリケーションのデプロイ時または再デプロイ時に設定されるイベント・インジェクション構成設定の場合、インジェクトするステージのコンポーネント構成設定を編集して、インジェクションを構成します。

たとえば、例に示したコンポーネント構成の一部は、イベント・インジェクション用にプロセッサを構成する方法を示しています。inject-parameters要素のactive子要素はインジェクションをオンにすることを指定し、channel-name要素はインジェクトされる要素の送信元のHTTPパブリッシュ・サブスクライブ(HTTP pub-sub)チャネルを指定します。

<processor>
    <name>FindCrossRates</name>
    <inject-parameters>
        <active>true</active>
        <channel-name>/NonClusteredServer/fx/FindCrossRates/output</channel-name>
    </inject-parameters>
    <rules>
        <!-- Query rules omitted. -->
    </rules>
</processor>

要素の詳細は、Oracle Event Processingスキーマ・リファレンスを参照してください。

14.2.5 イベントのトレース

イベント・インスペクタ・サービスHTTPパブリッシュ・サブスクライブ(HTTP pub-sub)サーバーを構成した後、イベント・インスペクタ・クライアントを使用して、EPNのいずれかのステージから退出するイベントをトレースできます。イベントをトレースするには、Oracle Event Processing Visualizerを使用してトレースを構成するか、アプリケーションでコンポーネント構成ファイルを編集して、アプリケーションのデプロイ時または再デプロイ時に設定されるトレース設定を指定します。

Oracle Event Processing Visualizerで、アプリケーションの再デプロイ時に破棄できる設定でイベント・トレースを構成します。『Oracle Event Processingビジュアライザの使用』のイベントのトレースに関する項を参照してください。

アプリケーションのデプロイ時または再デプロイ時に設定されるイベント・トレース構成設定について、トレース元のステージのコンポーネント構成設定を編集して、トレースを構成します。

たとえば、例に示したコンポーネント構成の一部は、イベント・トレース用にプロセッサを構成する方法を示しています。trace-parameters要素のactive子要素はトレースをオンにすることを指定し、channel-name要素はトレースされる要素の送信先のHTTPパブリッシュ・サブスクライブ(HTTP pub-sub)チャネルを指定します。

<processor>
    <name>FindCrossRates</name>
    <trace-parameters>
        <active>true</active>
        <channel-name>/NonClusteredServer/fx/FindCrossRates/output</channel-name>
    </trace-parameters>
    <rules>
        <!-- Query rules omitted. -->
    </rules>
</processor>

要素のリファレンス情報は、『Oracle Event Processing スキーマ・リファレンス』のプロセッサに関する項を参照してください。

14.2.6 イベント・インスペクタAPI

イベント・インスペクタAPIを使用して、イベントをインジェクトおよびトレースします。Oracle Event Processing APIに用意されているEventInspectorMBeanインタフェースを実装すると、イベントのトレースおよびインジェクション動作を制御できます。startInjectstopInjectstartTraceおよびstopTraceメソッドを呼び出すことができるのは、管理者およびモニター管理者のロールのみです。EventInspectorMBeanインタフェースとそのメソッドの詳細は、Oracle Event Processing Java APIリファレンスを参照してください。

EventInspectorMBeanインタフェースを実装すると、そのメソッドをアプリケーションから呼び出して、次のようにイベントのインジェクトおよびトレースが可能です。

イベントのインジェクト

  1. JMXを介して、サーバーからcom.bea.wlevs.eventinspector.management.EventInspectorMBeanのインスタンスを取得します。

  2. EventInspectorMBean.startInjectメソッドを呼び出し、HTTPパブリッシュ/サブスクライブ・チャネルのサーバーconfig.xmlファイル構成で指定されているステージでイベント・インジェクションを開始します。HTTPパブリッシュ/サブスクライブ・チャネルおよびサーバーを参照してください。

  3. 指定したHTTPパブリッシュ/サブスクライブ・チャネルにイベントをパブリッシュします。

  4. EventInspectorMBean.isInjectingメソッドを使用し、ステージでイベント・インジェクションが開始されたことを確認します。

  5. イベント・インジェクションを停止するには、EventInspectorMBean.stopInjectメソッドを呼び出します。

イベントのトレース

  1. JMXを介して、サーバーからcom.bea.wlevs.eventinspector.management.EventInspectorMBeanのインスタンスを取得します。

  2. EventInspectorMBean.startTraceメソッドを呼び出し、HTTPパブリッシュ/サブスクライブ・チャネルのサーバーconfig.xmlファイル構成で指定されているステージでイベント・トレースを開始します。HTTPパブリッシュ/サブスクライブ・チャネルおよびサーバーを参照してください。

  3. EventInspectorMBean.isTracingメソッドを使用し、HTTPパブリッシュ/サブスクライブ・チャネルでイベント・トレースが開始されたことを確認します。

  4. イベント・インジェクションを停止するには、EventInspectorMBean.stopTraceメソッドを呼び出します。

14.3 EPNシェル

EPNシェルには、テスト用のシェル・コマンドが用意されています。

Oracle Event Processingのアプリケーションです。EPNの操作をプログラムで実行する方法の詳細は、EPNコマンド・インタフェースを参照してください。

EPNシェルはApache Felix Gogoシェルを拡張し、OSGiフレームワークに標準のシェル・コマンド・プロンプトを提供します。Apache Felix Gogoのドキュメント(http://felix.apache.org/documentation/subprojects/apache-felix-gogo.html)を参照してください。

EPNシェルでサーバーを起動するには、/Oracle/Middleware/my_oep/ user_projects/domains/<my_domain>/<server>に移動し、次のようにEPNシェルでOracle Event Processingサーバーを起動します。

UNIX:

./startwlevs.sh -shell
...
g!

Windows:

startwlevs.cmd -shell
...
g!

EPNシェルが起動すると、g!というプロンプトが表示されます。すべてのコマンドのリストを表示するには、helpと入力します。EPNに固有のコマンドは、epn:channelのようにepn:という接頭辞が付きます。

g! help

特定のコマンドのヘルプを表示するには、help <command>と入力します。たとえば、beginコマンドのヘルプを表示するには、次のように入力してください。

g! help begin
begin - Begins new session for invoking EPN commands
   scope: epn
   parameters:
      CommandSession

注:

Apache Felix Gogoコマンドには、CommandSession引数を取るものがあります。これは、Apache Felix Gogoコマンドでは実行されない内部シェル引数です。EPNシェル・コマンドのヘルプ一覧を実行すると、ヘルプによってCommandSessionパラメータが一覧表示されますが、これは機能しません。

14.3.1 Oracle CQL問合せ

デフォルトでは、EPNセッションには暗黙的なOracle CQLプロセッサがあり、それがすべての出力をシェル・コンソールに表示するイベント・シンクに接続されます。Oracle CQL問合せをテストするには、次のように入力チャネルを作成し、問合せを定義してイベントを送信します。

g! begin
g! channel MyChannel [msg=String]
MyChannel
g! query "select * from MyChannel"
q0
g! send MyChannel [msg='Hi']
11:14:26 618 -> insert event: {msg=Hi}
q! end

EPNセッションを開始するにはbeginコマンドを使用し、EPNセッションを終了するにはendコマンドを使用します。セッションを終了すると、そのセッション中に作成されたEPNコンポーネントはすべて破棄されます。セッションはマルチスレッドに対応していません。

channelコマンドは、String型のmsgプロパティを持つevent-typeMyChannelを作成します。event-typeにJavaクラス名も指定できます。

queryコマンドは、このセッションの暗黙的なOracle CQLプロセッサで、"select * query from MyChannel"を登録します。プロセッサから問合せを削除するには、removeコマンドを使用します。

sendコマンドは、insertイベントをMyChannelにディスパッチします。セッションに1つのチャネルしかない場合、チャネルの名前はオプションです。たとえば、"send MyChannel [msg='Hi']""send [msg='Hi']"の2つのコマンドは同等です。

構文"[msg='Hi']"は、"msg"をキー、"Hi"を値としてキー/値のペアを1つ含むマップを作成します。これは、channel MyChannel [msg=String]の最初の行で作成されたevent-typeと一致します。

updateコマンドとdeleteコマンドを使用すると、リレーションベースのチャネルに更新イベントおよび削除イベントを送信できます。insertコマンドは、sendコマンドと同等です。また、statementコマンドを使用するとセッションで現在登録されている文をチェックでき、channelsコマンドを使用するとセッションで作成したチャネルを確認できます。eventtypesコマンドでは、サーバーにあるすべてのevent-typesの構造を表示できます。

Oracle CQLプロセッサの問合せの詳細は、Oracle CQLプロセッサを参照してください。

14.3.2 管理コマンド

管理コマンドを使用すると、デプロイされているOracle Event Processingアプリケーションのリスト、ライブラリのリスト、アプリケーションのインストール、既存のアプリケーションに対するイベントの送信、チャネル・イベントへのサブスクライブ、すべてのパブリック・ステージのリスト、OSGiサービスの取出し、標準Javaメソッドの呼出し、JMX操作の実行、サーバーの停止を行うことができます。

実行中のサーバーでデプロイされているOracle Event Processingアプリケーションをすべてリストします

g! listapps
com.bea.wlevs.dataservices

Oracle Event Processingライブラリをすべてリストします。次のコマンドは、EPNシェルを実行するためにモジュールのディレクトリで展開したバンドルをすべて一覧表示しています。

g! llistlibs
org.apache.felix.bundlerepository
org.apache.felix.gogo.runtime
com.oracle.cep.shell
org.apache.felix.gogo.command
org.apache.felix.gogo.shell

新しいアプリケーションをインストールします。次の例では、アプリケーションをデプロイしてすぐに起動しています。

g! deployapp file:///Users./oepapps/hwlloworld.jar

アプリケーションをアンデプロイします。

g! deployapp file:///Users./oepapps/hwlloworld.jar
g! undeployapp file:///Users./oepapps/hwlloworld.jar

sendinsertupdateおよびdeleteの各コマンドを使用するチャネルの完全名を指定して、既存のOracle Event Processingアプリケーションにイベントを送信します。この例では、helloworldアプリケーションでhelloworldInputChannelにイベントを送信します。これが機能するためには、EPNシェルで検索できるようにチャネルを公開する必要があります。チャネルを公開するには、まずアセンブリ・ファイルでadvertise属性をtrueに設定します。

アセンブリ・ファイルの設定は、次のとおりです。

<wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" advertise="true" >

EPNシェル・コマンドは次のとおりです。

g! event1=createevent HelloWorldEvent
g! $event1 message "Hi Shell"
g! send helloworld:helloworldInputChannel $event1

チャネルをサブスクライブします。サブスクライブするイベントは、ファイル名を指定するとシェル・コンソールまたはファイルに送信されます。アセンブリ・ファイルでadvertise属性をtrueに設定して、チャネルが公開されていることを確認します。次のコマンドは、helloworldアプリケーションからのすべての出力にサブスクライブし、その出力をシェル・コンソールに送信します。

g! subscribe helloworld:helloworldOutputChannel

アプリケーションのパブリックの(公開されている)ステージをすべてリストします

g!introspect helloworld
Application 'helloworld' provides the following OCEP services:
Event Channel 'helloworldOutputChannel' for Event Type 'HelloWorldEvent'

helloworld Oracle CQLプロセッサのCQLProcessorMBean取り出しgetAllQueries操作を呼び出します。

g! proc = mbean helloworld:helloworldProcessor CQLProcessor
g! $proc allQueries
helloworldRule
select * from helloworldInputChannel

取り出したmbeanをmbeanコマンドで使用すると、JMX操作のテストと操作が可能です。

サーバーを停止します。

g! stop

14.3.3 リグレッション・テスト

シェルをヘッドレスで実行してスクリプトを使用すると、アプリケーションのテストを自動化できます。たとえば、startwlevsコマンドでgosh.argsシステム・プロパティを指定すると、send-event.oepという名前の次のスクリプトを実行できます。

begin
channel -a [a=Long]
query "select * from ch0"
send 0 [a=1]
send 1 [a=2]
end

注:

スクリプトでは、sendコマンドの文字列タプル値を二重引用符で囲みます。たとえば、send [msg="Enter a value."]のようにします。一重引用符はスクリプトで機能しません。

サーバーを起動するときにsend-event.oepスクリプトを実行するには、startwlevsコマンドの最後の行を次のように編集します。

"$JAVA_HOME/bin/java" -Dgosh.args=send-event.oep $JVM_ARGS $DEBUG_ARGS -Dwlevs.home="$USER_INSTALL_DIR" -Dbea.home="$BEA_HOME"  -jar "${USER_INSTALL_DIR}/bin/wlevs.jar" $ARGS

次のように、他のスクリプトを呼び出すテスト・ドライバ・スクリプトを使用し、その出力を指示するのも1つの方法です。

source send-event.oep | tac test-output/log/send-event.out
source test-delete.oep | tac test-output/log/test-delete.out

14.3.4 EPN変数

EPNセッションに対してタイムスタンプ形式を設定する、またはタイムスタンプをオフにすることができます。

OUT_TIME: FORMATTED | PLAIN | OFF

出力イベントでタイムスタンプをオフにするには、次のように入力します。

g! OUT_TIME=OFF

書式設定したタイムスタンプを指定するには、次のように入力します。

h! OUT_TIME=FORMATTED

14.3.5 EPNコマンド

次のリストでは、EPNコマンドを示して説明します。

epn:begin: EPNコマンドを呼び出す新しいセッションを開始します。

epn:channel: パラメータに基づいて、次のように異なるアクションを実行します。

  • マップベースのイベント・タイプでチャネルを作成します。

  • 更新キーとJavaクラス・イベント・タイプを持つ名前付きのリレーション・チャネルを作成します。

  • マップベースのイベント・タイプで名前付きのチャネルを作成します。

  • Javaクラスのイベント・タイプで名前付きのチャネルを作成します。

  • Javaクラスのイベント・タイプでチャネルを作成します。

  • 更新キーとマップベースのイベント・タイプを持つ名前付きのリレーション・チャネルを作成します。

epn:channels: EPNスコープ内のすべてのチャネルを一覧表示します。

epn:createevent: 指定したイベント・タイプでイベントを作成します。

epn:end: EPNセッションを終了します。

epn:eventtypes: すべてのイベント・タイプを一覧表示します。

epn:heartbeat: アプリケーションによってタイムスタンプが設定されたチャネルにハートビートを送信します。

epn:query: Oracle CQL問合せを登録します。

epn:remove: EPNスコープ内に登録されているすべての文を削除します。

epn:send: 名前付きのチャネルに挿入イベントを送信します。sendinsertコマンドと同じです。

epn:senddelete: 名前付きのチャネルで名前付きのイベントを削除します。

epn:sendinsert: 名前付きのチャネルに挿入イベントを送信します。sendコマンドと同じです。

epn:sendupdate: 指定したURLにあるバンドルで、OSGiバンドルを更新します。

epn:statements: EPNスコープ内に登録されているすべてのOracle CQL文を一覧表示します。

epn:subscribe: イベント・チャネルにサブスクライブし、イベントをファイルに出力します。

epn:unsubscribe: イベント・チャネルからサブスクライブ解除します。

epn:view: Oracle CQLビューを登録します。

14.3.6 管理コマンド

次のリストでは、管理コマンドを示して説明します。

mngt:deployapp: オプションのパラメータを指定してアプリケーションをデプロイします。

mngt:deployrepapp: リポジトリからアプリケーションをデプロイします。

mngt:introspect: アプリケーションでそのパブリック・インタフェースをイントロスペクトします。

mngt:listapps: デプロイされているすべてのアプリケーションを一覧表示します。

mngt:listlibs: デプロイされているすべてのライブラリを一覧表示します。

mngt:mbean: ローカルMBeanサーバーからMBeanステージを取得します。

mngt:shutdown: サーバーをシャットダウンします。

mngt:undeployapp: 指定したアプリケーションをアンデプロイします。

14.4 EPNコマンド・インタフェース

EpnCommandインタフェースは、Oracle Event Processing EPN CQLプログラミング・モデルの上層に位置するJava APIです。JavaアプリケーションでEpnCommandインタフェースを使用すると、EPNコンポーネントを操作できます。

EPNセッションをプログラムで開始し、EPNシェルで説明したコマンド行EPNシェルを使用する場合と似たEPNコマンドを実行できます。

EPNセッションを開始するにはbeginSession()を使用し、EPNセッションを終了するにはendSession()を使用します。セッションを終了すると、そのセッション中に作成されたEPNコンポーネントはすべて破棄されます。セッションはマルチスレッドに対応していないため、アプリケーション・コードで同期する必要があります。

Oracle Event ProcessingアプリケーションでEPNコマンドを使用するには、まずEpnCommand OSGiサービスを取得します。これによって、サービスがOSGiサービス・ファクトリとして登録されます。OSGiサービスを取得すると、JUnitテスト・ケースに似たテスト・ケースを作成し、EPNコンポーネントとOracle CQL文のテストに使用できます。JUnitと同様のテスト・ケースに使用できるのは、EpnCommandクラスに公開されたコマンドのみです。

EpnCommandインタフェースを使用し、プログラミングによりOracle Event Processingアプリケーションを作成することもできます。

14.4.1 セッション変数

セッション変数を設定すると、出力イベントで使用するタイムスタンプ形式を指定できます。タイムスタンプに使用できるのは、FORMATTEDPLAINまたはOFFです。

14.4.2 メソッド

void beginSession(): コマンドを呼び出す新しいセッションを開始します。1回にアクティブにできるのは1つのセッションのみです。次のリストに、EpnCommandのメソッドとパラメータを示します。詳細は、EpnCommandのJavadocを参照してください。

endSession(): 現在のセッションを終了します。1回にアクティブにできるのは1つのセッションのみです。

void getEventChannels(): 現在のセッションで作成されたすべてのチャネルを返します。

EventChannel[] getEventChannel(String channelName): 名前付きのイベント・チャネルを返します。

EventChannel getEventChannel(String channelName): 名前付きのイベント・チャネルを取得します。

パラメータに基づいて異なるタイプのチャネルを作成します。

  • EventChannel createChannel(String channelName, Class<?> clazz): Javaクラスのイベント・タイプで、システム・タイムスタンプの付加された新しいチャネルを作成します。

  • EventChannel createChannel(boolean relation, String applicationTimestampProp, boolean totalOrder, List<String> keys, String channelName, Class<?> class): Javaクラスのイベント・タイプで新しいチャネルを作成します。

  • EventChannel createChannel(boolean relation, String applicationTimestampProp, boolean totalOrder, List<String> keys, String channelName, Class<?> class, EventBuilder.Factory factory): Javaクラスのイベント・タイプで新しいチャネルを作成します。

  • EventChannel createChannel(String channelName, Map<String, String> metadata): メタデータベースのイベント・タイプで、システム・タイムスタンプの付いた新しいチャネルを作成します。

  • EventChannel createChannel(boolean relation, String applicationTimestampProp, boolean totalOrder, List<String> keys, String channelName, Map<String, String> metadata): メタデータベースのイベント・タイプで新しいチャネルを作成します。

  • EventChannel createChannel(boolean relation, String applicationTimestampProp, boolean totalOrder, List<String> keys, String channelName, Map<String, String> metadata, EventBuilder.Factory factory): メタデータベースのイベント・タイプで新しいチャネルを作成します。

Processor[] getProcessors(): 現在のセッションで作成されたすべてのOracle CQLプロセッサを返します。

Processor createProcessor(): 現在のセッションでOracle CQLプロセッサを作成します。

StreamSource link(StreamSource fromStage, StreamSink toStage): ステージとステージを接続します。

void unlink(StreamSource source, StreamSink sink): シンクからソースを切断します。

Statement createView(Processor processor, String id, String StatementValue): Oracle CQLビューを作成します。

Statement createQuery(Processor processor, String id, String statementValue): Oracle CQL問合せを作成します。

Object createEvent(String eventTypeName): イベント・タイプ名に基づいてイベントを作成します。イベントが作成されるのは、イベント・タイプ・リポジトリで使用できる場合に限られます。

MapEventObject createMapEvent(EventChannel channel, Map<String, Object> event): メタデータベースのチャネルに対してマップ・イベントを作成します。

void sendInsert(String channelName, Object event): チャネルに挿入イベントを送信します。

void sendUpdate(String channelName, Object event): チャネルに更新イベントを送信します。

void sendDelete(String channelName, Object event): チャネルに削除イベントを送信します。

void sendHeartbeat(Long timestamp, String channelName): チャネルにハートビートを送信します。

14.4.3

次の例は、基本的なJUnitテスト・ケースです。

//Get the OSGI service
ServiceReference ref = ctx.getServiceReference(EpnCommand.class.getName());
commandSession = (EpnCommand) ctx.getService(ref);

//Begin a session
commandSession.begin();

//Create an Oracle CQL processor 
Processor p1 = commandSession.createProcessor("p1");

//Create two stream channels from the MyEvent Java class.
EventChannel ch1 = commandSession.createChannel(false, "c1", MyEvent.class);  EventChannel ch2 = commandSession.createChannel(false, "c2", MyEvent.class);

//Create a listener to retrieve events that equal event e1
//The MyEventListener class implements the StreamSink or RelationSink interface
MyEventListener listener = new MyEventListener();

//Connect channel ch1 and processor p1
commandSession.link((StreamSource) ch1, (StreamSink) p1);
 
//Connect channel p1 and processor ch2
commandSession.link((StreamSource) p1, (StreamSink) ch2);
 
//Connect channel ch2 and processor listener
commandSession.link((StreamSource) ch2, (StreamSink) listener);

//Create the query in processor p1
commandSession.createQuery(p1, "q1", "select * from c1");

//Create event e1 and assign two properties, a and 1.
Object e1 = new MyEvent("a", 1);

//Send insert event e1 to channel ch1
ch1.sendInsertEvent(e1);

//Test whether event e1 equals the event retrieved by the listener
assertEquals(e1, listener.getEvent());

//End the session        
commandSession.end();