この章では、Oracle Event ProcessingアプリケーションのJavaクラスとシームレスに対話するCQLコードを記述できる、Oracle Continuous Query Language (Oracle CQL)の拡張であるOracle Javaデータ・カートリッジの使用方法について説明します。
この章では、Oracle Javaデータ・カートリッジが公開する型、メソッド、フィールドおよびコンストラクタについて説明します。これらの型、メソッド、フィールドおよびコンストラクタを、Oracle CQLのネイティブ型と同様に、Oracle CQLの問合せおよびビューで使用できます。
この章の内容は次のとおりです。
詳細は、次を参照してください。
Oracle Javaデータ・カートリッジは、Oracle Event ProcessingアプリケーションでJavaクラスとシームレスに対話するOracle CQLの問合せおよびビューを記述できる組込みのJavaカートリッジです。
この項の内容は、次のとおりです。
Oracle Javaデータ・カートリッジでは、カートリッジID com.oracle.cep.cartrdiges.java
を使用します。
Oracle Javaデータ・カートリッジは、Oracle Event Processingのデフォルトのデータ・カートリッジです。
デフォルトのJavaパッケージ名の下の型、またはjava.lang
システム・パッケージの下の型について、Oracle CQL問合せでパッケージ名またはデータ・カートリッジ名で修飾されていないJava型を参照できます。
<query id="q1"><![CDATA[ select String(”foo”) … ]]></query>
詳細は、次を参照してください。
Oracle Javaデータ・カートリッジでは、Oracle CQL問合せが参照するJavaクラスのロードについて、次のポリシーをサポートしています。
詳細は、次を参照してください。
『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のパッケージのエクスポート方法に関する項
これは、デフォルトのクラス・ローディング・ポリシーです。
このモードでは、Oracle Javaデータ・カートリッジはJavaクラスの検索時に、有効範囲内のアプリケーションのクラス・スペースを使用します。
これは、型がローカル名によってのみ指定されている場合、すなわち識別子が1つで、他の識別子がパッケージで使用されていない場合にのみ適用できます。次のような場合です。
select String(”foo”) …
次の場合には適用できません。
select java.lang.String(”foo”) …
この場合、手順は次のようになります。
通常どおりに、アプリケーションのクラス・スペースを使用して、1つの識別子(ID1
と呼びます)で定義されたクラスをロードします。これに失敗した場合、
アプリケーションで、パッケージとは関係なく、バンドルの内部クラス・パス内で名前がID1
と一致するクラスが定義されているかどうかを確認します。これに失敗した場合、
アプリケーションでImport-Package
MANIFEST
ヘッダー文が指定されているかどうかを確認します。これとID1
を使用して、Javaクラスをロードできます。
例については、15.1.2.4項「クラスのロード例」を参照してください。
これは、オプションのクラス・ローディング・ポリシーです。このポリシーを使用するには、Oracle Event Processingアプリケーションに次のMANIFEST
ヘッダー・エントリを含める必要があります。
OCEP_JAVA_CARTRIDGE_CLASS_SPACE: APPLICATION_NO_AUTO_IMPORT_CLASS_SPACE
このモードは、パッケージが指定されていない場合に、Oracle Event Processingがパッケージの自動インポートを試行しない点を除いて、アプリケーション・クラス・スペース・ポリシーとほぼ同じです。
詳細は、15.1.2.1項「アプリケーション・クラス・スペース・ポリシー」を参照してください。
これは、オプションのクラス・ローディング・ポリシーです。このポリシーを使用するには、Oracle Event Processingアプリケーションに次のMANIFEST
ヘッダー・エントリを含める必要があります。
OCEP_JAVA_CARTRIDGE_CLASS_SPACE: SERVER_CLASS_SPACE
Oracle CQL問合せでは、エクスポート元のアプリケーションやモジュールに関係なく、エクスポートされたすべてのJavaクラスを参照できます。
また、問合せでは、ランタイムJDKクラスを含む、OSGiフレームワークの親クラス・ローダーに表示されるすべてのクラスにアクセスできます。
すなわち、Oracle CQLアプリケーションには、他のOracle Event Processingアプリケーションで定義されたクラスを、それらがエクスポートされているかぎり参照するOracle CQL問合せを含めることができます。これにより、新しいJavaライブラリを提供することが唯一の目的であるJavaベース・カートリッジの作成が容易になります。
注意: Oracle Event Processingアプリケーション内のプロセッサがOracle CQL問合せを定義する場合であっても、このアプリケーションの内部クラス・パスの一部であるJavaクラスを参照できるのは、これがエクスポートされている場合のみです。 |
例については、15.1.2.4項「クラスのロード例」を参照してください。
図15-1に示す例があるとします。アプリケーションB1
は、アプリケーションB2
がエクスポートするパッケージmypackage3
をインポートします。
表15-1に、アプリケーション・クラス・スペースまたはサーバー・クラス・スペースのどちらで実行されているかによって、これら2つの異なるアプリケーションがアクセスできるクラスを示します。
表15-1 クラス・ローディング・ポリシー別のクラスのアクセシビリティ
クラス・ローディング・ポリシー | アプリケーションB1 | アプリケーションB2 |
---|---|---|
アプリケーション・クラス・スペース |
|
|
サーバー・クラス・スペース |
|
|
アプリケーションB1では、Oracle CQL問合せでJavaクラスA、BおよびCのいずれも使用できます。
select A … select B … select C …
しかし、アプリケーションB2では、Oracle CQL問合せでJavaクラスAおよびBは使用できません。JavaクラスCおよびDのみ使用できます。
select C … select D …
JavaメソッドにアクセスするOracle CQL式は、次のアルゴリズムを使用してメソッドを解決します。
すべてのパラメータは、15.1.4項「データ型マッピング」に説明されているように、Java型に変換されます。
たとえば、Oracle CQL INTEGER
はJavaプリミティブint
に変換されます。
標準のJavaメソッド解決ルールが、Java言語仕様の第3版、15.12項「Method Invocation Expressions」に説明されているとおりに適用されます。
注意: 可変arityメソッドはサポートされていません。詳細は、Java言語仕様の第3版、12.12.2.4項を参照してください。 |
例として、次のOracle CQL式を考えてみます。
attribute.methodA(10)
attribute
は、オーバーロードされた次のメソッドを定義する型mypackage.MyType
です。
methodA(int)
methodA(Integer)
methodA(Object)
methodA(long)
リテラル10はプリミティブ型int
であるため、優先順位は次のとおりです。
methodA(int)
methodA(long)
methodA(Integer)
methodA(Object)
詳細は、15.1.2項「クラスのロード」を参照してください。
Oracle Javaデータ・カートリッジは、Oracle CQLネイティブのデータ型とJavaデータ型の間に、固定の非対称なマッピングを適用します。
表15-2に、Oracle CQLネイティブのデータ型とJavaデータ型の間のマッピングを示します。
表15-3に、Javaデータ型とOracle CQLネイティブのデータ型の間のマッピングを示します。
表15-2 Oracle Javaデータ・カートリッジ: Oracle CQLからJavaデータ型へのマッピング
Oracle CQLネイティブのデータ型 | Javaデータ型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
脚注 1 プリミティブなJavaデータ型
表15-3 Oracle Javaデータ・カートリッジ: Javaデータ型からOracle CQLへのマッピング
Javaデータ型 | Oracle CQLネイティブのデータ型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
脚注 1 プリミティブなJavaデータ型
他のすべてのJavaクラスは、複合型としてマップされます。
これらのデータ型マッピングの詳細は、次の項を参照してください。
Oracle CQLネイティブのデータ型とその暗黙的および明示的なデータ型変換の詳細は、2.1項「データ型」を参照してください。
Oracle CQLデータ型CHAR
はjava.lang.String
にマップされ、java.lang.String
はOracle CQLデータ型CHAR
にマップされます。すなわち、Oracle CQL CHAR
として定義された属性のjava.lang.String
メンバー・フィールドおよびメソッドにアクセスできます。たとえば、a1
がOracle CQL CHAR
型として宣言されている場合、次のような問合せを記述できます。
<query id="q1"><![CDATA[ select a1.substring(1,2) ]]></query>
Oracle CQL CHAR
リテラルであっても、リテラルのメンバー・フィールドおよびメソッドにはアクセスできません。たとえば、次のような問合せは使用できません。
<query id="q1-forbidden"><![CDATA[ select "hello".substring(1,2) ]]></query>
Javaの配列はOracle CQLデータ・カートリッジの配列に変換され、Oracle CQLデータ・カートリッジの配列はJavaの配列に変換されます。これは、複合型と単純型の両方に適用されます。
データ・カートリッジのTABLE
句を使用して、Oracle CQL問合せのFROM
句内のデータ・カートリッジ関数から返された複数の行にアクセスできます。
詳細は、次を参照してください。
通常、Oracle Javaデータ・カートリッジはjava.util.Collection
インタフェースを実装するインスタンスをOracle CQL複合型に変換します。
Oracle CQL問合せは、java.util.Collection
のメンバーを介して繰り返すことができます。
データ・カートリッジのTABLE
句を使用して、Oracle CQL問合せのFROM
句内のデータ・カートリッジ関数から返された複数の行にアクセスできます。
詳細は、次を参照してください。
Oracle Javaデータ・カートリッジ型は、SELECT
およびWHERE
句内の式で使用できます。
Oracle Javaデータ・カートリッジ型は、ORDER BY
句内の式では使用できません。
詳細は、次を参照してください。
この項では、Oracle Event ProcessingアプリケーションでOracle Javaデータ・カートリッジをどのように使用できるかを中心に、次のような一般的な使用例を説明します。
詳細は、次を参照してください。
この手順では、Javaクラス(Address.java
)として定義されたイベント・プロパティ・タイプを持つ、タプル(Student
)として定義された1つのイベント・タイプを使用するOracle Event Processingアプリケーションで、Oracle Javaデータ・カートリッジを使用する方法について説明します。
Javaクラスを使用して問合せするには:
Address.java
クラスを、例15-1に示すように実装します。
例15-1 Address.javaクラス
package test; class Address { String street; String state; String city; String [] phones; }
この例では、Address.java
クラスがこのアプリケーションに属すると仮定します。
Address.java
クラスが他のOracle Event Processingアプリケーションに属する場合、親アプリケーションでエクスポートする必要があります。詳細は、15.2.2項「エクスポートしたJavaクラスを使用する問合せ方法」を参照してください。
イベント・タイプ・リポジトリを、例15-2に示すように定義します。
例15-2 イベント・タイプ・リポジトリ
<event-type-repository> <event-type name="Student"> <properties> <property name="name" type="char"/> <property name="address" type="Address"/> </properties> </event-type> <event-type name="Address"> <class-name>test.Address</class-name> </event-type> <event-type-repository>
test.Address
クラスは、このアプリケーションに属しているため、イベント・タイプ・リポジトリで宣言できます。これにより、自動的にこのアプリケーション内でクラスに対してグローバルにアクセスできるようになります。パッケージをエクスポートする必要はありません。
例15-3
に示すように、アダプタがStudent
イベントをチャネルStudentStreamに提供していると仮定します。
例15-4
に示すように、StudentStream
がOracle CQL問合せq1でプロセッサに結び付けられると仮定します。
例15-4 Oracle CQL問合せ
<processor> <rules> <query id="q1"><![CDATA[ select name, address.street as street, address.phones[0] as primary_phone from StudentStream ]]></query> </rules> </processor>
Oracle Javaデータ・カートリッジでは、標準のJava APIを使用してOracle CQL問合せからaddress
イベント・プロパティにアクセスできます。
この手順では、Javaクラス(Address.java
)として定義されたイベント・プロパティ・タイプを持つ、タプル(Student
)として定義された1つのイベント・タイプを使用するOracle Event Processingアプリケーションで、Oracle Javaデータ・カートリッジを使用する方法について説明します。この手順では、Address.javaクラスは別のOracle Event Processingアプリケーションに属します。これは、同じOracle Event Processingサーバーにデプロイされた他のOracle Event Processingアプリケーションにアクセスできるように、親アプリケーションでエクスポートされます。
Javaクラスを使用して問合せするには:
Address.java
クラスを、例15-1に示すように実装します。
Address.java
クラスを含むtest
パッケージをエクスポートします。
詳細は、『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のパッケージのエクスポート方法に関する項を参照してください。
test
パッケージは、このOracle Event Processingアプリケーションの一部であるか、このアプリケーションと同じOracle Event Processingサーバーにデプロイされた他のOracle Event Processingアプリケーションの一部です。
イベント・タイプ・リポジトリを、例15-2に示すように定義します。
例15-3
に示すように、アダプタがStudent
イベントをチャネルStudentStreamに提供していると仮定します。
例15-4
に示すように、StudentStream
がOracle CQL問合せq1でプロセッサに結び付けられると仮定します。
例15-8 Oracle CQL問合せ
<processor> <rules> <query id="q1"><![CDATA[ select name, address.street as street, address.phones[0] as primary_phone from StudentStream ]]></query> </rules> </processor>
Oracle Javaデータ・カートリッジでは、標準のJava APIを使用してOracle CQL問合せからaddress
イベント・プロパティにアクセスできます。