プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Stream Analyticsによるイベント処理用アプリケーションの開発
12c (12.2.1.2.0)
E82664-01
目次へ移動
目次

前
前へ
次
次へ

3 イベントおよびイベント・タイプ

イベント・タイプは、イベントに含まれるデータを定義するデータ構造です。生のイベント・データがOracle Stream Analyticsアプリケーションに到着すると、アプリケーションはそのデータを特定のイベント・タイプのイベントにバインドします。イベント・タイプは、データ・セットおよび対応するデータ型の観点からアプリケーションで定義します。

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

3.1 イベントの動作

イベントは、発生するか発生している事象に関連する構造化されたデータです。たとえば、サーバーのクラスタの変更にアプリケーションが対応している場合、イベントにより、サーバーを監視するデバイスで収集されるスナップショット・データが取得されます。

または、株式市場の取引に関連する傾向およびパターンがアプリケーションによって監視されている場合、イベントには、株式の取引に対応するイベント・データが含まれます。

イベント・データは、様々な形式でアプリケーションに到達します。イベント・タイプを作成してアプリケーション内のデータを表すことによって、データを操作するためのアプリケーション・ロジックを予測可能な方法で作成できます。

イベント・データは、イベント処理ネットワーク(EPN)を介してやり取りされます。イベント・タイプを設計する場合は、コード内でイベント・データにどのようにアクセスし、そのデータをどのように処理および操作するかについて考慮してください。

3.2 イベント・タイプのデータ構造の選択

イベント・タイプは、その構造をJavaBeanクラス、タプルまたはjava.util.Mapクラスから取得します。イベント・タイプの構築には、JavaBeanクラスを使用することをお薦めします。JavaBeanはアプリケーション内における柔軟性がより高いため、既存のシステムと簡単に統合できます。

JavaBeanイベント・タイプには柔軟性があります。たとえば、JavaBeanイベント・タイプをタプルまたはjava.util.Mapイベント・タイプのプロパティに割り当てます。次のコードは、addressプロパティをJavaBeanイベント・タイプAddressとして定義するイベント・タイプStudentを示します。

<wlevs:event-type-repository>
<wlevs:event-type type-name="Student">
  <wlevs:properties>
    <wlevs:property name="name" type="char"/>
    <wlevs:property name="address" type="classpackage.Address"/>
  </wlevs:properties>
</wlevs:event-type>
</wlevs:event-type-repository>

JavaBeanを使用すると、イベント・タイプ・ビルダー・クラスを実装して、イベント・タイプのインスタンス化を厳密に制御することもできます。イベント・タイプ・ビルダー・クラスの詳細は、イベント・タイプ・ビルダー・クラスでのイベント・タイプのインスタンス化の制御を参照してください。

表3-1では、JavaBeanクラス、タプルおよびjava.util.Mapクラスを比較しています。

表3-1 イベント・タイプのデータ型

データ型 説明 利点および制限

JavaBean

JavaBean規則で書き込まれるJavaクラス。書き込むロジックで使用される以外に、タイプのアクセッサ(getおよびset)メソッドはOracle Stream AnalyticsサーバーおよびOracle CQLプロセッサによって使用され、イベント・プロパティ値を取得および設定します。

利点: 最大の柔軟性およびイベントを処理するアプリケーション・ロジックの使いやすさを提供するため、このタイプはベスト・プラクティスです。アクセッサ・メソッドを介して、直接プロパティ値にアクセスします。JavaBeanクラスを使用すると、Oracle Stream Analyticsアプリケーションと他のシステムを統合する場合に役立つ可能性が高くなります。タイプのインスタンス化方法を制御する場合、イベント・タイプ・ビルダー・クラスを実装できます。

制限: 構成ファイルでイベント・タイプを単純に宣言するのではなく、JavaBeanクラスを書き込む必要があります。Oracle CQLビューを使用してこれを回避できますが、Oracle CQLはGROUP BY、PARTITION BYおよびORDER BYのJavaBeanプロパティをサポートしません。

Tuple

EPNアセンブリ・ファイルで宣言的に作成して、登録する構造。

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

利点: イベント・タイプを作成するJavaプログラミングは必要ありません。EPNアセンブリ・ファイルで宣言して、イベント・タイプを作成します。迅速なプロトタイピングに役立ちます。

制限: Javaアプリケーション・ロジックのこのタイプのインスタンスの使用では、イベント・タイプ・リポジトリにプログラムからアクセスしてインスタンスのプロパティ値を取得する必要があります。また、タプルを使用すると、Oracle Stream Analyticsと他のシステムを統合する場合に役立つ可能性は低くなります。

java.util.Map

java.util.Mapのインスタンスに基づいています。Mapインタフェースを実装または拡張しません。正確には、EPNアセンブリ・ファイルでイベント・タイプを構成する場合にインタフェースを使用することを指定します。Javaコードを書き込んでタイプ・インスタンスにアクセスする場合、Mapインスタンスとして処理します。

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

利点: タイプを作成するJavaプログラミングは必要ありません。EPNアセンブリ・ファイルで宣言して、イベント・タイプを作成します。迅速なプロトタイピングに役立ちます。

制限: 他のタイプと同じように実行しません。

3.3 設計制約

イベント・タイプの設計時には、CSVアダプタおよびデータベース表に関する次の制約に注意してください。

CSVアダプタの制約

CSVアダプタとともに使用するイベント・タイプのプロパティを宣言的に指定する場合、表3-2に示すデータ型のみ使用できます。

表3-2 CSVアダプタのデータ型

データ型 使用方法

char

単一または複数の文字値。char値およびjava.lang.String値の両方に使用します。

オプションで、length属性を使用して、idという名前のプロパティに対してchar値の最大長を指定できます。デフォルトの長さは256文字です。256文字を超える必要がある場合、適当な長さを指定する必要があります。

int

java.lang.Integerで指定される範囲内の数値

float

java.lang.Floatで指定される範囲内の数値

long

java.lang.Longで指定される範囲内の数値。

double

java.lang.Doubleで指定される範囲内の数値

詳細は、次を参照してください。

データベース表の制約

イベント・データのソースとしてリレーショナル・データベース表を使用して、実行時に表からイベント・タイプ・インスタンスにデータをバインドします。イベント・データ・ソースがデータベース表の場合、次の表で表されるガイドラインに従う必要があります。

イベント・タイプでデータベース表からデータを受信する場合、タイプに構成されたプロパティごとにデータベースの特定の列からデータを受信します。イベント・タイプを構成する場合、表3-3に示されているように、プロパティの子要素に特定の意味および値制約を持つ属性があることに注意してください。

表3-3 EPNアセンブリ・ファイルevent-type要素プロパティ属性

属性 説明

name

SQL CREATE TABLE文で指定されている、アクセスする表の列の名前。すべての列を指定する必要はありません。

type

列のSQLデータ型に対応している表3-4内のOracle Stream Analytics Javaタイプ。

length

SQL CREATE TABLE文で指定されている列サイズ。

リレーショナル・データベース表とともに使用するイベント・タイプのプロパティを指定する場合、表3-4に示す追加JDBCタイプの制限に従う必要があります。

ストリームをDerbyデータベースに結合する場合に、結合条件で2つのタイムスタンプ値(1つの値はストリーム属性、他方の値はDerbyデータソース属性から)が比較されるとき、Derbyデータベースが述語評価を実行します。ただし、Derbyデータベースはyyyy-MM-dd-HH.mm.ss[.nnnnnn]形式のみをサポートしています。Derbyデータベースが評価を正しく実行するには、ストリームのタイムスタンプ値でDerbyデータベースの形式を使用している必要があります。

表3-4 SQL列タイプおよびOracle Stream Analyticsタイプの対応するもの

SQLタイプ Oracle Stream Analytics Javaタイプ com.bea.wlevs.ede.api.型 説明

ARRAY

[Ljava.lang.Object

java.lang.Objectの深度1の配列。

BIGINT

java.math.BigInteger

bigint

java.math.BigIntegerのインスタンス。

BINARY

byte[]

byteの深度1の配列。

BIT

java.lang.Boolean

boolean

java.lang.Booleanのインスタンス。

BLOB

byte[]

byteの深度1の配列。

BOOLEAN

java.lang.Boolean

boolean

java.lang.Booleanのインスタンス。

CHAR

java.lang.Character

char

java.lang.Characterのインスタンス。

CLOB

byte[]

byteの深度1の配列。

DATE

java.sql.Date

timestamp

java.sql.Dateのインスタンス。

DECIMAL

java.math.BigDecimal

java.math.BigDecimalのインスタンス。

BINARY_DOUBLEまたはDOUBLE

java.lang.Double

double

java.lang.Doubleのインスタンス。

BINARY_FLOATまたはFLOAT

java.lang.Double

float

java.lang.Doubleのインスタンス。

INTEGER

java.lang.Integer

int

java.lang.Integerのインスタンス。

JAVA_OBJECT

java.lang.Object

object

java.lang.Objectのインスタンス。

LONGNVARCHAR

char[]

char

charの深度1の配列。

LONGVARBINARY

byte[]

byteの深度1の配列。

LONGVARCHAR

char[]

char

charの深度1の配列。

NCHAR

char[]

char

charの深度1の配列。

NCLOB

byte[]

byteの深度1の配列。

NUMERIC

java.math.BigDecimal

java.math.BigDecimalのインスタンス。

NVARCHAR

char[]

char

charの深度1の配列。

OTHER

java.lang.Object

object

java.lang.Objectのインスタンス。

REAL

java.lang.Float

float

java.lang.Floatのインスタンス。

SMALLINT

java.lang.Integer

int

java.lang.Integerのインスタンス。

SQLXML

xmltype

xmltype

TIME

java.sql.Time

java.sql.Timeのインスタンス。

TIMESTAMP

java.sql.Timestamp

timestamp

java.sql.Timestampのインスタンス。

TINYINT

java.lang.Integer

int

java.lang.Integerのインスタンス。

VARBINARY

byte[]

byteの深度1の配列。

VARCHAR

char[]

char

charの深度1の配列。

詳細は、表ソースの構成を参照してください。

3.4 イベント・タイプ・リポジトリ

Oracle Stream Analyticsはイベント・タイプ・リポジトリでイベント・タイプを管理します。Oracle Stream Analyticsサーバーは、実行時にアセンブリ・ファイルにアクセスし、アプリケーションの管理に必要な情報を取得します。

次の例は、リポジトリ内のイベント・タイプ・エントリを示します。

<wlevs:event-type-repository>
  <wlevs:event-type type-name="TradeEvent">
    <wlevs:class>tradereport.TradeEvent</wlevs:class>
  </wlevs:event-type>
</wlevs:event-type-repository>

イベント・タイプを定義および編集するには、Oracle JDeveloperの「イベント」タブを使用し、アセンブリ・ファイルを直接処理するか、アプリケーション・コードからAPIをコールします。「イベント」タブは、Oracle JDeveloperプロジェクトのEPN図を開くと表示されます。

詳細は、イベント・タイプ・リポジトリへのアクセスを参照してください。

3.5 プロパティ

イベント・タイプを作成する場合、<wlevs:properties>および<wlevs:property>要素を<wlevs:event-type>要素に追加し、イベント・タイプのプロパティを定義します。

プロパティには、ティッカ名、ティッカ・シンボルおよび引け値などの情報の種類を定義するnameおよびtype属性や、StringおよびDoubleなどの対応するデータ型があります。<wlevs:event-type要素の詳細は、『Oracle Stream Analyticsスキーマ・リファレンス』のwlevs:event-typeに関する項を参照してください。

アセンブリ・ファイル

次のアセンブリ・ファイル・エントリは、1つのイベント・タイプおよび<wlevs:class>要素によって定義される1つのプロパティを持つ簡単なイベント・タイプを示します。このイベント・タイプのプロパティは、JavaBeanクラス内に定義されます。

  <wlevs:event-type-repository>
    <wlevs:event-type type-name="TradeEvent">
      <wlevs:class>tradereport.TradeEvent</wlevs:class>
    </wlevs:event-type>
  </wlevs:event-type-repository>

次のアセンブリ・ファイル・エントリは、3つの<wlevs:property>要素が含まれる<wlevs:properties>要素によって定義されるプロパティを持つメッセージ数イベント・タイプを示します。

<wlevs:event-type-repository>
        <wlevs:event-type id="messagecounts" type-name="SimpleEvent">
            <wlevs:properties>
                <wlevs:property name="msg" type="char" />
                <wlevs:property name="count" type="long" />
                <wlevs:property name="time_stamp" type="timestamp" />
        </wlevs:properties>
    </wlevs:event-type>
...
</wlevs:event-type-repository>

3.6 間隔プロパティおよびタイムスタンプ・プロパティ

イベント・タイプは、日数-秒数および年数-月数間隔プロパティとローカル・タイム・ゾーンを使用するタイムスタンプ・プロパティもサポートしています。

3.6.1 間隔プロパティ

次のアセンブリ・ファイル・エントリは、間隔プロパティを示します。

<wlevs:event-type-repository>
  <wlevs:event-type type-name="IntervalDataTypeEvent">
    <wlevs:properties>
      <wlevs:property name="Comment" type="char" length="256" />
        <wlevs:property name="intervalProp" type="interval day(1) to second(2)"/>
        <wlevs:property name="intervalymProp" type="interval year(2) to month"/>
        <wlevs:property name="intervaldhProp" type="interval day to hour"/>
        <wlevs:property name="intervaldmProp" type="interval day to minute"/>
        <wlevs:property name="intervalhsProp" type="interval hour(1) 
                to second(2)"/>
        <wlevs:property name="intervalhmProp" type="interval hour to minute"/>
        <wlevs:property name="intervalmsProp" type="interval minute(2) 
                to second(2)"/>
        <wlevs:property name="intervaldProp" type="interval day(1)"/>
        <wlevs:property name="intervalyProp" type="interval year(2)"/>
        <wlevs:property name="intervalmProp" type="interval month"/>
    </wlevs:properties>
  </wlevs:event-type>
</wlevs:event-type-repository>

日数-秒数の組合せ:

INTERVAL DAY[(day_precision)]
TO SECOND[(fractional_seconds_precision)]

day_precisionは、DAY日時フィールドの桁数です。0から9までの値を使用できます。デフォルトは2です。

fractional_seconds_precisionは、SECOND日時フィールドの小数部の桁数です。0から9までの値を使用できます。デフォルト値は6です。

年数-月数の組合せ:

INTERVAL YEAR [(year_precision)] TO MONTH

year_precisionは、YEAR日時フィールドの桁数です。year_precisionのデフォルト値は2です。

3.6.2 ローカル・タイム・ゾーンを使用するタイムスタンプ・プロパティ

次のアセンブリ・ファイル・エントリは、ローカル・タイム・ゾーンを使用するタイムスタンプ・プロパティを示します。

<wlevs:event-type-repository>
<wlevs:event-type type-name="IntervalDataTypeEvent">
<wlevs:properties>
  <wlevs:property name="Comment" type="char" length="256" />
  <wlevs:property name="timestamptzProp" type="timestamp with time zone"/>
  <wlevs:property name="timestampltzProp" type="timestamp with local time zone"/>
</wlevs:properties>
</wlevs:event-type>
</wlevs:event-type-repository>

タイム・ゾーンを使用:

TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE

fractional_seconds_precisionは、SECOND日時フィールドの小数部に格納される桁数をオプションで指定します。このデータ型の列を作成する場合、値は0から9までの範囲内の数に設定できます。デフォルト値は6です。

ローカル・タイム・ゾーンを使用:

TIMESTAMP [(fractional_seconds_precision)] WITH LOCAL TIME ZONE

fractional_seconds_precisionは、SECOND日時フィールドの小数部に格納される桁数をオプションで指定します。このデータ型の列を作成する場合、値は0から9までの範囲内の数に設定できます。デフォルト値は6です。

3.7 JavaBeanイベント・タイプの作成および登録

最初に、イベント・タイプが保持するイベント・データを識別してから、イベント・タイプに必要なプロパティを決定します。この項では、次のステップについて説明します。JavaBeanをイベント・ソースまたはイベント・シンクにする方法の詳細は、イベントBeanを参照してください。

3.7.1 データ型

プロパティには次のJavaタイプを使用できます。

  • Javaクラスの完全修飾名。この名前は、Class.forName()ルールに準拠し、アプリケーションのクラス・ローダーで使用できる必要があります。

  • intまたはfloatなどのJavaプリミティブ。

  • プリミティブまたはクラス名に大カッコ([])を追加した配列。たとえば、short[]またはjava.lang.Integer[]など。

3.7.2 JavaBeanイベント・タイプの宣言的作成

  1. イベント・タイプを表すためにJavaBeanクラスを作成します。
    package com.bea.wlevs.example.algotrading.event;
     
    public final class MarketEvent {
        private final Long timestamp;
        private final String symbol;
        private final Double price;
        private final Long volume;
        private final Long latencyTimestamp;
     
        public MarketEvent() {}
     
        public Double getPrice() {
            return this.price;
        }
        public void setPrice(Double price) {
            this.price = price;
        }
     
        public String getSymbol() {
            return this.symbol;
        }
        public void setSymbol(String symbol) {
            this.symbol = symbol;
        }
     
        public Long getTimestamp() {
            return this.timestamp;
        }
        public void setTimestamp(Long timestamp) {
            this.timestamp = timestamp;
        }
     
        public Long getLatencyTimestamp() {
            return this.latencyTimestamp;
        }
        public void setLatencyTimestamp(Long latencyTimestamp) {
            this.latencyTimestamp = latencyTimestamp;
        }
     
        public Long getVolume() {
            return this.volume;
        }
        public void setVolume(Long volume) {
            this.volume = volume;
        } 
    
        // Implementation for hashCode and equals methods.
    }
    
  2. JavaBeanクラスをコンパイルします。
  3. Oracle Stream Analyticsイベント・タイプ・リポジトリにJavaBeanイベント・タイプを登録します。
    <wlevs:event-type-repository>
        <wlevs:event-type type-name="MarketEvent">
          <wlevs:class>
              com.bea.wlevs.example.algotrading.event.MarketEvent
          </wlevs:class>
        </wlevs:event-type>
    </wlevs:event-type-repository>

3.7.3 JavaBeanイベント・タイプのプログラムによる作成

ステップ1と2は、JavaBeanイベント・タイプの宣言的作成でのステップ1と2と同じです。その後、ステップ3として、次の手順を実行します。

JavaBeanイベント・タイプをプログラムで登録するには、次のようにEventTypeRepositoryクラスを使用します。

EventTypeRepository rep = getEventTypeRepository();
rep.registerEventType("MarketEvent",    com.bea.wlevs.example.algotrading.event.MarketEvent.getClass()
);

詳細は、イベント・タイプ・リポジトリへのアクセスを参照してください。

3.7.4 使用方法

JavBeanイベント・タイプを作成すると、アプリケーションのJavaコードでこれを参照できます。次のコードは、onInsertEventメソッドの実装でMarketEventイベント・タイプを参照しています。onInsertEventメソッドは、イベントを受信するイベント・シンク・クラスのメソッドです。イベント・シンクの詳細は、イベント・シンクのインタフェースを参照してください。

public void onInsertEvent(Object event) throws EventRejectedException {
    if (event instanceof MarketEvent){
        MarketEvent marketEvent = (MarketEvent) event;
        System.out.println("Price: " + marketEvent.getPrice());
    }
}

次のOracle CQLルールは、SELECT文でMarketEventイベント・タイプを参照する方法を示します。ここでは、イベント・タイプがMarketEventであるmarketEventChannelと呼ばれるアップストリーム・チャネルを前提としています。

<query id="helloworldRule">
    <![CDATA[ SELECT MarketEvent.price FROM marketEventChannel [NOW] >
</query>

また、プロパティ・データ型をJavaBeanとして実装すると、Oracle CQLコードでは、標準のJavaBeanスタイル・プロパティ・アクセスを使用してそれらのプロパティ内の値を取得できます。たとえば、次の構成スニペットの抜粋では、JavaBeanクラスとして実装されるStudentTypeイベント・タイプを宣言しています。school.Studentクラスは、Address JavaBeanクラスであるaddressプロパティを持つJavaBeanです。次の問合せは、addressプロパティの基礎となるAddressオブジェクトの値にアクセスする方法を示します。この問合せでは、郵便番号が97で始まる生徒の住所を選択します。

<query id="studentAddresses">
    FOR StudentType SELECT student.address
    FROM
        StudentType as student
    WHERE
        student.address.postalCode LIKE '^97'
</query>

onInsertEvent実装でのEventRejectedExceptionの動作

削除しない例外についてはonInsertEvent実装でEventRejectedExceptionを明示的にスローする必要があります。EventProcessingExceptionを発生させると、CQLプロセッサを介してエラーのソースにまでこの例外が伝播されます。例外が複数存在する場合、EventRejectedExceptionによって例外をダウンストリーム・リスナーからチェーンできます。EventRejectedExceptionはCQLプロセッサによってソフト例外に変換されます。詳細は、フォルト処理を参照してください。

3.8 タプル・イベント・タイプの作成および登録

最初に、イベント・タイプが保持するイベント・データを識別してから、イベント・タイプに必要なプロパティを決定します。イベントを設計する場合、プロパティを設計制約に示されているデータ型に制限する必要があります。

タプルベースのイベント・タイプの場合、Javaコードでは、EventTypeRepository APIを使用してプロパティ値を常に設定および取得する必要があります。

注:

EPNが複数のストリームで構成されている場合、同じタイムスタンプのタプルがEPNによって処理される順序は保証されません。

データ型

アプリケーション・アセンブリ・ファイルにタプル・イベント・タイプのプロパティを宣言的に指定する場合、プロパティ・タイプで任意のネイティブOracle CQLデータ型を使用できます。

次のXMLは、アプリケーション・アセンブリ・ファイルで様々な型を使用する方法を示します。

<wlevs:event-type-repository>
        <wlevs:event-type type-name="SimpleEvent">
            <wlevs:properties>
                <wlevs:property name="id" type="char" length="1000" />
                <wlevs:property name="msg" type="char" />
                <wlevs:property name="count" type="double" />
                <wlevs:property name="time_stamp" type="timestamp" />
        </wlevs:properties>
    </wlevs:event-type>
...
</wlevs:event-type-repository>

手順

3.8.1 アセンブリ・ファイルでのタプル・イベント・タイプの作成

wlevs:event-type-repository要素およびwlevs:event-type子要素を使用してOracle Stream Analyticsイベント・タイプ・リポジトリでイベント・タイプを宣言的に登録します。

アセンブリ・ファイルでのタプル・イベント・タイプの作成

次のXML節では、pricefromRateおよびtoRateプロパティを使用してCrossRateEventタプル・イベント・タイプを作成しています。

<wlevs:event-type-repository>
    <wlevs:event-type type-name="CrossRateEvent">
        <wlevs:properties>
            <wlevs:property name="price" type="double"/>
            <wlevs:property name="fromRate" type="char"/>
            <wlevs:property name="toRate" type="char"/>
        </wlevs:properties>
    </wlevs:event-type>
</wlevs:event-type-repository>

『Oracle Stream Analyticsスキーマ・リファレンス』のwlevs:event-type-repositoryに関する項を参照してください。

3.8.2 Javaコードでのタプル・イベント・タイプの使用

Javaコードでタプル・イベント・タイプを使用する前に、イベント・タイプ・リポジトリを作成する必要があります。イベント・タイプ・リポジトリを使用して、プロパティ名および値を取得してこれらをコード内で処理できるようにします。イベント・タイプ・リポジトリを作成するには、com.bea.wlevs.ede.api.EventTypeRepositoryクラスを組み込みます。

次のコードは、イベント・シンク・クラスの一部です。このコードにより、setEventTypeRespositoryメソッドを呼び出してイベント・タイプ・リポジトリが作成されます。これにより、Oracle Stream Analyticsサーバーによってeventパラメータを使用してonInsertEventメソッドが呼び出されます。onInsertEventメソッドは、eventに関する情報をイベント・タイプ・リポジトリから取得します。

EventTypeRepositoryオブジェクトの作成の詳細は、イベント・タイプ・リポジトリへのアクセスを参照してください。

@Service
// Create an event type repository
public void setEventTypeRepository(EventTypeRepository etr) {
    etr_ = etr;
}
...
// Called by the server to pass in the event type instance.
public void onInsertEvent(Object event) throws EventRejectedException {

    // Get the event type for the current event instance
    EventType eventType = etr_.getEventType(event);

    // Get the event type name
    String eventTypeName = eventType.getTypeName();

    // Get the event property names
    String[] propNames = eventType.getPropertyNames();

    // See if property you're looking for is present
    if(eventType.isProperty("fromRate")) {
        // Get property value
        Object propValue = 
            eventType.getProperty("fromRate").getValue(event);
    } 
    // Throw com.bea.wlevs.ede.api.EventRejectedException to have an  
    // exception propagated up to senders. Other errors will be
    // logged and dropped.
}

3.8.3 Oracle CQLコードでのタプル・イベント・タイプ・インスタンスの使用

次のOracle CQLルールは、SELECT文でCrossRateEventを参照する方法を示します。FxQuoteStreamは、CrossRateEventイベント・タイプを持つチャネルです。

<query id="FindCrossRatesRule"><![CDATA[
    select ((a.price * b.price) + 0.05) as internalPrice, 
        a.fromRate as crossRate1, 
        b.toRate as crossRate2 
    from FxQuoteStream [range 1] as a, FxQuoteStream [range 1] as b   
    where 
        NOT (a.price IS NULL)
    and
        NOT (b.price IS NULL)
    and
        a.toRate = b.fromRate
></query>

3.9 マップ・イベント・タイプの作成および登録

最初に、イベント・タイプが保持するイベント・データを識別してから、イベント・タイプに必要なプロパティを決定します。構成XMLをアプリケーション・アセンブリ・ファイルに追加して、java.util.mapイベント・タイプを作成します。

ハッシュ・マップに基づくイベント・タイプは、マップ・ベースのイベント・タイプと呼ばれます。

データ型

プロパティには次のJavaタイプを使用できます。

  • Javaクラスの完全修飾名。この名前は、Class.forName()ルールに準拠し、アプリケーションのクラス・ローダーで使用できる必要があります。

  • intまたはfloatなどのJavaプリミティブ。

  • プリミティブまたはクラス名に大カッコ([])を追加した配列。たとえば、short[]またはjava.lang.Integer[]など。

次のXMLコードは、イベント・リポジトリ内のイベント・プロパティ宣言の例を示します。

<wlevs:event-type-repository>
    <wlevs:event-type type-name="AnotherEvent">
        <wlevs:properties type="map">
          <wlevs:property>
             <entry key="name" value="java.lang.String"/>
             <entry key="employeeId" value="java.lang.Integer[]"/>
             <entry key="salary" value="float"/>
             <entry key="projectIds" value="short[]"/>
          </wlevs:property>
        <wlevs:properties>
    </wlevs:event-type>
</wlevs:event-type-repository>

java.util.Mapイベント・タイプの作成および登録方法:

最初に、イベント・タイプが保持するイベント・データを識別してから、イベント・タイプに必要なプロパティを決定します。

  • 宣言的に登録するには、次のように、wlevs:event-type-repository要素のwlevs:event-type子要素を使用して、EPNアセンブリ・ファイルを編集します。

    <wlevs:event-type-repository>
        <wlevs:event-type type-name="AnotherEvent">
            <wlevs:properties type="map">
                <wlevs:property name="name" value="java.lang.String"/>
                <wlevs:property name="age" value="java.lang.Integer"/>
                <wlevs:property name="address" value="java.lang.String"/>
            </wlevs:properties >
        </wlevs:event-type>
    </wlevs:event-type-repository>
    

    実行時に、AnotherEventクラスのBeanインスタンスがOracle Stream Analyticsで生成されます。AnotherEventクラスには、nameageおよびaddressの3つのプロパティがあります。

  • プログラムで登録するには、次のように、EventTypeRepositoryクラスを使用します。

    EventTypeRepository rep = getEventTypeRepository();
    java.util.Map map = new Map({name, java.lang.String}, 
        {age, java.lang.Integer}, {address, java.lang.String});
    rep.registerEventType("AnotherEvent", map);
    
    

使用方法

public void onInsertEvent(Object event)
        throws EventRejectedException {

        java.util.Map anEvent = (java.util.Map) event;
        System.out.println("Age: " + anEvent.get("age"));
}

次のOracle CQLルールでは、SELECT文でMarketEventを参照するかを表します。

<query id="helloworldRule">
    <![CDATA[ select age from eventChannel [now] >
</query>

3.10 イベント・タイプ・リポジトリへのアクセス

Oracle Stream Analyticsイベント・タイプ・リポジトリでは、アプリケーションに定義されたイベント・タイプを追跡します。Oracle JDeveloperでイベント・タイプを作成する場合、このイベント・タイプをOracle Stream Analyticsアプリケーションで使用できます。

場合によっては、リポジトリに明示的にアクセスするコードを書き込む必要がある場合があります。たとえば、イベント・タイプをタプルとして作成する場合、タイプのインスタンスにアクセスするJavaロジックでは、リポジトリAPIを使用してタイプ定義を最初に取得し、このAPIを使用してインスタンス・プロパティ値にアクセスする必要があります。

EventTypeRepositoryは、単一のOSGiサービスです。これは単一であるため、これを識別するためにインタフェース名のみを指定する必要があります。次のいずれかの方法でOSGiからサービスを取得できます。

詳細は、Oracle Stream Analytics Java APIリファレンスを参照してください。

3.10.1 EPNアセンブリ・ファイル

EPNアセンブリ・ファイルのosgi:referenceを指定して、EventTypeRepositoryにアクセスできます。

<osgi:reference id="etr" interface="com.bea.wlevs.ede.api.EventTypeRepository" />
<bean id="outputBean" class="com.acme.MyBean" >
    <property name="eventTypeRepository" ref="etr" />
</bean>

その後、MyBeanクラスでは、Springにより初期化されたeventTypeRepositoryプロパティを使用して、EventTypeRepositoryにアクセスできます。

package com.acme;

import com.bea.wlevs.ede.api.EventTypeRepository;
import com.bea.wlevs.ede.api.EventType;

public class MyBean {
    private EventTypeRepository eventTypeRepository;

    public void setEventTypeRepository(EventTypeRepository eventTypeRepository) {
        this.eventTypeRepository = eventTypeRepository;
    }

    public void onInsertEvent(Object event) throws EventRejectedException {
        // get the event type for the current event instance
        EventType eventType = eventTypeRepository.getEventType(event);
       // Throw com.bea.wlevs.ede.api.EventRejectedException to have an   
       // exception propagated up to senders. Other errors will be
       // logged and dropped.
    }
}

3.10.2 Spring-DM @ServiceReference注釈

Javaソースのプロパティを初期化するために、Spring-DM @ServiceReference注釈を使用してEventTypeRepositoryにアクセスできます。

import org.springframework.osgi.extensions.annotation.ServiceReference;
import com.bea.wlevs.ede.api.EventTypeRepository;
...
@ServiceReference
setEventTypeRepository(EventTypeRepository etr) {
    ...
}

3.10.3 Oracle Stream Analytics @Service注釈

Javaソースのプロパティを初期化するために、Oracle Stream Analytics @Service注釈で、EventTypeRepositoryにアクセスできます。

import com.bea.wlevs.util.Service;
import com.bea.wlevs.ede.api.EventTypeRepository;
...
@Service
setEventTypeRepository(EventTypeRepository etr) {
    ...
} 

3.11 アプリケーション・バンドル間でのイベント・タイプの共有

それぞれのOracle Stream Analyticsアプリケーションは、固有のJavaクラス・ローダーを取得し、そのクラス・ローダーを使用してアプリケーションのクラスをロードします。このため、デフォルトでは、あるアプリケーションから別のアプリケーションのクラスにアクセスすることはできません。

ただし、イベント・タイプ・リポジトリはシングルトン・サービスであるため、あるバンドルでリポジトリを構成し、イベント・タイプ・クラスを明示的にエクスポートすることによって、(同一のOracle Stream Analyticsサーバーにデプロイされた)別のバンドル内のアプリケーションでそれらの共有されたイベント・タイプを使用できるようになります。

この場合、イベント・タイプ名は、Oracle Stream Analyticsサーバー・インスタンス全体に範囲が設定されます。このため、他のバンドルからの共有イベント・タイプと同名のイベント・タイプを作成しようとすると例外が送出されますが、これらのイベント・タイプのクラスは異なります。

イベント・タイプ・クラスを共有するには、共有するイベント・タイプ・リポジトリが含まれているバンドルのMANIFEST.MFファイルのExport-Packageヘッダーにパッケージ名を追加します。

共有イベント・タイプを使用するアプリケーションが含まれているすべてのバンドルよりもに、イベント・タイプ・リポジトリが含まれているバンドルを必ずデプロイするようにします。そうしないと、デプロイメント例外が送出されます。

詳細は、次を参照してください。

3.12 イベント・タイプ・ビルダー・クラスでのイベント・タイプのインスタンス化の制御

イベント・タイプ・ビルダーを作成して、イベント・タイプ・インスタンスの作成方法をより詳細に制御できます。たとえば、イベント・タイプ・ビルダーを使用して、構成されたイベントのプロパティがJavaBeanとして実装したクラスなどのイベント・タイプ・クラスのプロパティに正しくバインドされていることを確認できます。

CQLコードで仮定されるイベント・プロパティ名がクラスで宣言されているプロパティの名前と異なる場合などで、イベント・タイプ・ビルダーが必要になります。

たとえば、イベント・タイプにfirstnameプロパティが含まれている一方で、イベント・タイプで実行されるCQLルールではそのプロパティがfnameと呼ばれるとします。さらに、(たとえば、他のバンドルからの共有イベント・クラスを使用しているなどの理由から)、相互の互換性を実現するためにイベント・タイプ・クラスを変更することも、CQLルールを変更することもできないと想定します。この場合は、イベント・タイプ・ビルダー・ファクトリを使用して、プロパティ名をfirstnameのかわりにfnameにするよう、イベント・タイプ・インスタンスの作成方法を変更できます。

実行時、イベント・タイプ・ビルダー・クラスはOracle Event Processingサーバーからプロパティ値を受信し、それらの値を使用して作成したイベント・タイプ・クラスのインスタンスを作成します。次に、イベント・タイプ・ビルダーはインスタンスをサーバーに戻します。このように、サーバーで構成されたプロパティをイベント・タイプ・プロパティにマップする方法を決定できない場合、ビルダー・クラスは実質的に中間のインスタンス化しているイベント・タイプです。

イベント・タイプ・ビルダーの作成および使用には、次の項に示されているように、ビルダーを使用するためのビルダー・クラスの実装およびJavaBeanイベント・タイプの構成が含まれます。

3.12.1 イベント・タイプ・ビルダー・クラスの実装

イベント・タイプ・ビルダー・ファクトリをプログラミングする場合は、com.bea.wlevs.ede.api.EventBuilderインタフェースのEventBuilder.Factory内部インタフェースを実装する必要があります。createBuilderおよびcreateEventなどの実装する必要のあるメソッドの詳細は、Oracle Stream Analytics Java APIリファレンスを参照してください。

次の例は、FXサンプルからのイベント・タイプ・ビルダー・ファクトリ・クラスの例です。

package com.bea.wlevs.example.fx;

import java.util.HashMap;
import java.util.Map;
import com.bea.wlevs.ede.api.EventBuilder;
import com.bea.wlevs.example.fx.OutputBean.ForeignExchangeEvent;

public class ForeignExchangeBuilderFactory implements EventBuilder.Factory {

    // Called by the server to get an instance of this builder.
    public EventBuilder createBuilder() {
        return new ForeignExchangeBuilder();
    }

    // Inner interface implementation that is the builder.
    static class ForeignExchangeBuilder implements EventBuilder {

        // A Map instance to hold properties until the event type is instantiated.
        private Map<String,Object> values = new HashMap<String,Object>(10);

        // Called by the server to put an event type property. Values from the map 
        // will be used to instantiate the event type.
        public void put(String property, Object value) throws IllegalStateException {
            values.put(property, value);
        }

        // Called by the server to create the event type instance once property
        // values have been received.
        public Object createEvent() {
            return new ForeignExchangeEvent(
                (String) values.get("symbol"),
                (Double) values.get("price"),
                (String) values.get("fromRate"),
                (String) values.get("toRate"));
        }
    }
}

3.12.2 イベント・タイプ・ビルダーを使用するイベント・タイプ

EPNアセンブリ・ファイルでイベント・タイプを登録する場合は、wlevs:event-type要素の<wlevs:property name="builderFactory">子要素を使用してイベント・タイプ・ビルダー・クラスの名前を指定します。name属性のハードコード化されたbuilderFactoryの値によって、このイベントのインスタンスを作成する際はデフォルト・ファクトリではなく指定されたファクトリ・クラスを使用する必要があることがOracle Stream Analyticsに対してアラートされます。たとえば、FXサンプルでは、ビルダー・ファクトリは太字で示されたとおりに登録されています。

<wlevs:event-type-repository>
  <wlevs:event-type type-name="ForeignExchangeEvent">
    <wlevs:class>com.bea.wlevs.example.fx.OutputBean$ForeignExchangeEvent</wlevs:class>
    <wlevs:property name="builderFactory">
      <bean id="builderFactory"
            class="com.bea.wlevs.example.fx.ForeignExchangeBuilderFactory"/>
    </wlevs:property>
  </wlevs:event-type>
</wlevs:event-type-repository>