| Oracle® Fusion Middleware Oracle Complex Event Processing CQL言語リファレンス 11gリリース1 (11.1.1.6.2) B61613-04 |
|
![]() 前 |
![]() 次 |
この章では、Oracle Continuous Query Language (Oracle CQL)の拡張であるOracle Javaデータ・カートリッジの使用方法について説明します。このデータ・カートリッジによって、Oracle CEPアプリケーションのJavaクラスとシームレスに対話するCQLコードを記述できます。
この章では、Oracle Javaデータ・カートリッジが公開する型、メソッド、フィールドおよびコンストラクタについて説明します。これらの型、メソッド、フィールドおよびコンストラクタを、Oracle CQLのネイティブ型と同様に、Oracle CQLの問合せおよびビューで使用できます。
この章の内容は、次のとおりです。
詳細は、以下を参照してください。
Oracle Javaデータ・カートリッジは、Oracle CEPアプリケーションでJavaクラスとシームレスに対話するOracle CQLの問合せおよびビューを記述するための、組込みのJavaカートリッジです。
この項の内容は、次のとおりです。
Oracle Javaデータ・カートリッジでは、カートリッジID com.oracle.cep.cartrdiges.javaを使用します。
Oracle Javaデータ・カートリッジは、Oracle CEPのデフォルトのデータ・カートリッジです。
デフォルトのJavaパッケージ名の下の型、またはjava.langシステム・パッケージの下の型について、Oracle CQL問合せでパッケージ名またはデータ・カートリッジ名で修飾されていないJava型を参照できます。
<query id="q1"><![CDATA[
select String(“foo”) …
]]></query>
詳細は、以下を参照してください。
Oracle Javaデータ・カートリッジでは、Oracle CQL問合せが参照するJavaクラスのロードについて、次のポリシーをサポートしています。
詳細は、以下を参照してください。
『Oracle Fusion Middleware Oracle Complex 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 CEPアプリケーションに次のMANIFESTヘッダー・エントリを含める必要があります。
OCEP_JAVA_CARTRIDGE_CLASS_SPACE: APPLICATION_NO_AUTO_IMPORT_CLASS_SPACE
このモードは、パッケージが指定されていない場合に、Oracle CEPがパッケージの自動インポートを試行しない点を除いて、アプリケーション・クラス・スペース・ポリシーとほぼ同じです。
詳細は、15.1.2.1項「アプリケーション・クラス・スペース・ポリシー」を参照してください。
これは、オプションのクラス・ローディング・ポリシーです。このポリシーを使用するには、Oracle CEPアプリケーションに次のMANIFESTヘッダー・エントリを含める必要があります。
OCEP_JAVA_CARTRIDGE_CLASS_SPACE: SERVER_CLASS_SPACE
このモードでも、Oracle CEPはアプリケーションのクラス・スペースを使用しますが、パッケージが指定されていない場合はパッケージの自動インポートを試行しません。
Oracle CQL問合せでは、エクスポートしているアプリケーションやモジュールに関係なく、エクスポートされたすべてのJavaクラスを参照できます。
また、問合せでは、ランタイムJDKクラスを含む、OSGiフレームワークの親クラス・ローダーに表示されるすべてのクラスにアクセスできます。
すなわち、Oracle CQLアプリケーションには、他のOracle CEPアプリケーションで定義されたクラスを参照するOracle CQL問合せを含めることができます(エクスポートされているかぎり)。これにより、新しいJavaライブラリを提供することが唯一の目的であるJavaベース・カートリッジの作成が容易になります。
|
注意: Oracle CEPアプリケーション内のプロセッサがOracle CQL問合せを定義する場合であっても、Oracle CEPアプリケーションの内部クラス・パスの一部である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 CEPアプリケーションでOracle Javaデータ・カートリッジをどのように使用できるかを中心に、一般的な使用例を説明します。内容は次のとおりです。
詳細は、以下を参照してください。
この手順では、Javaクラス(Address.java)として定義されたイベント・プロパティ・タイプを持つ、タプル(Student)として定義された1つのイベント・タイプを使用するOracle CEPアプリケーションで、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 CEPアプリケーションに属する場合、親アプリケーションでエクスポートする必要があります。詳細は、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 CEPアプリケーションで、Oracle Javaデータ・カートリッジを使用する方法について説明します。この手順では、Address.javaクラスは別のOracle CEPアプリケーションに属します。同じOracle CEPサーバーにデプロイされた他のOracle CEPアプリケーションからアクセスできるように、親アプリケーションでエクスポートされます。
Javaクラスを使用して問合せするには:
Address.javaクラスを、例15-1に示すように実装します。
Address.javaクラスを含むtestパッケージをエクスポートします。
詳細は、『Oracle Fusion Middleware Oracle Complex Event Processing開発者ガイド for Eclipse』のパッケージのエクスポート方法に関する項を参照してください。
testパッケージはこのOracle CEPアプリケーションの一部であるか、このアプリケーションと同じOracle CEPサーバーにデプロイされた他のOracle CEPアプリケーションの一部です。
イベント・タイプ・リポジトリを、例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イベント・プロパティにアクセスできます。