Oracle® Fusion Middleware

Oracle Stream Analyticsによるイベント処理用アプリケーションの開発

12c (12.2.1.2.0)

E82664-01(原本部品番号:E67745-01)

2016年10月

ストリーミング・イベントを処理するOracle Event Processingのスケーラブルなアプリケーションを設計および作成する方法。

Oracle Fusion Middleware Oracle Stream Analyticsによるイベント処理用アプリケーションの開発, 12c (12.2.1.2.0)

E82664-01

Copyright © 2007, 2016, Oracle and/or its affiliates. All rights reserved.

原本著者: Oracle® Corporation

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs. No other rights are granted to the U.S. Government.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

目次

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

このガイドの新機能

第I部 アプリケーションの開発

1 アプリケーションの開発の概要

- 1.1 EPN図

- 1.2 コンポーネント構成

- 1.3 ストリームとリレーション

- 1.4 アプリケーションのスケーラビリティおよび高可用性

- 1.5 アプリケーション・ライフサイクル

- 1.6 APIの概要

- 1.7 Springフレームワーク

- 1.8 OSGiサービス・プラットフォーム

2 アプリケーションおよびリソース構成

- 2.1 アプリケーション構成

- 2.2 アセンブリ・ファイル構造

- 2.2.1 ネストされたEPNアセンブリ・ファイルのステージ

- 2.2.2 EPNアセンブリ・ファイル内の外部ステージ

- 2.3 コンポーネント構成ファイル構造

- 2.4 コンポーネントおよびサーバー構成

- 2.5 リソース・アクセス構成

- 2.5.1 リソース・アクセス注釈

- 2.5.2 静的リソース・インジェクション

- 2.5.2.1 静的リソース名

- 2.5.2.2 動的リソース名

- 2.5.3 動的リソース・インジェクション

- 2.5.4 JNDIによる動的リソース参照

- 2.5.5 リソース名解決

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

- 3.1 イベントの動作

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

- 3.3 設計制約

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

- 3.5 プロパティ

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

- 3.6.1 間隔プロパティ

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

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

- 3.7.1 データ型

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

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

- 3.7.4 使用方法

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

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

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

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

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

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

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

- 3.10.2 Spring-DM @ServiceReference注釈

- 3.10.3 Oracle Stream Analytics @Service注釈

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

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

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

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

4 アダプタ

- 4.1 アダプタの作成

- 4.2 クラスタ配分サービス

- 4.3 パスワードの暗号化

- 4.4 JAXBのサポート

- 4.4.1 EclipseLink Moxy

- 4.4.2 API

- 4.5 CSVアダプタ

- 4.6 EDNアダプタ

- 4.6.1 使用方法

- 4.6.2 EDNアダプタの作成

- 4.7 ファイル・アダプタ

- 4.8 HTTPパブリッシュ/サブスクライブ・アダプタ

- 4.9 HTTPパブリッシュ/サブスクライブ・アダプタのカスタム・コンバータBean

- 4.9.1 Bayeuxプロトコル

- 4.9.2 カスタム・コンバータBeanの作成

- 4.10 JMSアダプタ

- 4.10.1 サービス・プロバイダ

- 4.10.2 インバウンド・アダプタ構成

- 4.10.2.1 シングルおよびマルチスレッドのインバウンドJMSアダプタ

- 4.10.2.2 恒久サブスクリプション用のJMSアダプタの構成

- 4.10.3 アウトバウンド・アダプタ構成

- 4.11 JMSカスタム・メッセージ・コンバータBean

- 4.11.1 インタフェースの実装

- 4.11.2 インバウンドJMSアダプタの実装

- 4.11.3 アウトバウンドJMSアダプタの実装

- 4.12 Oracle Business Rulesアダプタ

- 4.13 QuickFixアダプタ

- 4.13.1 サポートされているQuickFixバージョンおよびサポートされていないメッセージ・タイプ

- 4.13.2 QuickFixアダプタの構成

- 4.13.3 ソケットベースのアクセプタのフェイルオーバーの構成

- 4.14 RESTアダプタ

- 4.15 RMIアダプタ

- 4.16 Twitterアダプタ

- 4.16.1 Twitterアダプタの構成

- 4.16.2 Twitter アダプタの依存関係

- 4.16.3 Twitterインバウンド・アダプタ

- 4.16.4 フィルタ・オプションを使用した例

- 4.17 MQTTアダプタ

- 4.17.1 MQTT構成パラメータ

- 4.17.2 MQTTレシーバEPN

- 4.17.3 MQTTセンダーEPN

- 4.18 Kafkaアダプタ

- 4.18.1 Kafkaからのメッセージを受信するインバウンド・アダプタ

- 4.18.2 Kafkaにメッセージを送信するアウトバウンド・アダプタ

- 4.18.3 Kafka構成

- 4.19 コヒーレンス・アダプタ

- 4.19.1 コヒーレンス・インバウンド・アダプタ

- 4.19.2 コヒーレンス・アウトバウンド・アダプタ

- 4.19.3 OracleCoherenceCache

- 4.19.4 EmployeeEvent

5 チャネル

- 5.1 チャネルを使用するタイミング

- 5.2 チャネル構成

- 5.2.1 アセンブリ・ファイル

- 5.2.2 構成ファイル

- 5.3 ダウンストリーム・チャネルに出力する問合せの制御

- 5.4 バッチ処理チャネル

- 5.5 フォルト処理

- 5.6 EventPartitionerチャネル

- 5.7 分散フロー

- 5.7.1 分散フローの例

- 5.7.2 ローカル・パーティション化チャネル

6 Oracle CQLプロセッサ

- 6.1 プロセッサのデータ・ソース

- 6.2 アセンブリ・ファイルおよび構成ファイル

- 6.3 問合せ

- 6.3.1 ストリーム・チャネル

- 6.3.2 時間ベースのリレーション(ウィンドウ)

- 6.3.2.1 ストリームからリレーションへの演算子

- 6.3.2.2 リレーションからストリームへの演算子

- 6.3.2.3 NOWウィンドウおよび最終イベント・ウィンドウ

- 6.3.3 プロセッサ出力制御(スライド)

- 6.3.4 ビュー

- 6.4 CQL集計

- 6.5 表ソースの構成

- 6.5.1 アセンブリ・ファイル

- 6.5.2 構成ファイル

- 6.6 パラレル問合せ実行用のOracle CQLプロセッサの構成

- 6.6.1 パラレル問合せ実行のサポートの設定

- 6.6.2 ordering-constraint属性

- 6.6.3 問合せのパーティション化でのpartition-order-capacityの使用

- 6.6.4 制限事項

- 6.7 フォルト処理

- 6.7.1 フォルト・ハンドラ・クラスの実装

- 6.7.2 フォルト・ハンドラの登録

7 イベントBean

- 7.1 イベントBeanおよびSpring Bean

- 7.1.1 スレッドの動作

- 7.1.2 ハートビート・イベントの受信

- 7.1.3 イベントBeanの作成

- 7.1.4 Spring Beanの作成

- 7.2 イベント・シンクのインタフェース

- 7.2.1 StreamSinkの実装

- 7.2.2 RelationSinkの実装

- 7.3 イベント・ソースのインタフェース

- 7.3.1 StreamSenderの実装

- 7.3.2 RelationSenderの実装

8 キャッシュ済イベント・データ

- 8.1 キャッシングの定義

- 8.1.1 サポート対象のキャッシュ実装

- 8.1.2 ユース・ケース

- 8.2 Oracle Coherenceキャッシング・システムおよびキャッシュの構成

- 8.2.1 アセンブリ・ファイル

- 8.2.2 構成ファイル

- 8.2.3 キャッシュ・ローダーBean

- 8.3 ローカル・キャッシング・システムおよびキャッシュの構成

- 8.3.1 アセンブリ・ファイル

- 8.3.2 構成ファイル

- 8.4 イベント・リスナーとしてのキャッシュの構成

- 8.5 キーによるキャッシュのインデックス

- 8.5.1 アセンブリ・ファイル

- 8.5.2 メタデータ注釈

- 8.5.3 複合キー

- 8.6 イベント・ソースとしてのキャッシュの構成

- 8.7 キャッシュ・リスナーによるキャッシュの構成

- 8.8 サードパーティのキャッシング・システムおよびキャッシュの構成

- 8.9 キャッシュおよび他のデータ・ソース間のデータの交換

- 8.9.1 読取り専用データ・ソースからのキャッシュ・データのロード

- 8.9.2 読取り/書込みデータ・ソースでのデータの交換

- 8.10 アプリケーション・コードからキャッシュへのアクセス

- 8.10.1 Oracle CQL文からキャッシュへのアクセス

- 8.10.2 アダプタからキャッシュへのアクセス

- 8.10.3 ビジネスPOJOからキャッシュへのアクセス

- 8.10.4 Oracle CQLユーザー定義関数からキャッシュへのアクセス

- 8.10.5 JMXによるキャッシュへのアクセス

- 8.10.5.1 Oracle Stream Analytics Visualizerを使用したJMXによるキャッシュへのアクセス方法

- 8.10.5.2 Javaを使用したJMXによるキャッシュへのアクセス方法

9 EclipseLink、JPAおよびOracle Coherence

- 9.1 高度な手順

- 9.2 HelloWorldの例

- 9.2.1 persistence.xml構成ファイル

- 9.2.2 HelloWorldAdapter.java

- 9.2.3 HelloWorldEvent.java

- 9.2.4 HelloWorldBean.java

- 9.3 JPA Coherenceの例

- 9.3.1 persistence.xml構成ファイル

- 9.3.2 クラス

- 9.3.2.1 CoherenceMapListener.java

- 9.3.2.2 PriceTarget.java

- 9.3.2.3 PriceTargetLoader.java

- 9.3.2.4 SaleEvent.java

- 9.3.2.5 SaleEventsGenerator.java

10 Webサービス

- 10.1 サポート対象のプラットフォーム

- 10.2 アプリケーションからのWebサービスの起動

- 10.3 アプリケーションのWebサービスとしての公開

11 パラメータ化されたアプリケーション

- 11.1 アプリケーション・パラメータ

- 11.2 オブジェクト・クラス定義

- 11.3 属性の説明

- 11.4 ターゲット

- 11.5 metatypeファイルの例

- 11.6 パラメータ化されたアプリケーションを使用できる場合

- 11.6.1 アプリケーションの文書化

- 11.6.2 チャネル構成

- 11.6.3 Oracle CQLプロセッサの問合せ

- 11.7 HelloWorldアプリケーションのデプロイ

12 インターナショナライゼーション

- 12.1 メッセージ・カタログ

- 12.1.1 階層

- 12.1.2 名前付け

- 12.1.3 メッセージ引数

- 12.1.4 フォーマット

- 12.1.5 メッセージ・カタログのローカライゼーション

- 12.2 ローカライゼーション・クラスの生成

第II部 デプロイ、テストおよびデバッグ

13 アセンブルおよびデプロイ

- 13.1 OSGiバンドル

- 13.2 アプリケーションの依存関係

- 13.3 アプリケーション・ライブラリ

- 13.3.1 ライブラリ・ディレクトリ

- 13.3.2 ライブラリ拡張ディレクトリ

- 13.4 デプロイメント順序

- 13.5 構成履歴

- 13.6 appCによるOSGiバンドルのアセンブル

- 13.7 bundle.shによるOSGiバンドルのアセンブル

- 13.7.1 ファイルの準備と編成

- 13.7.2 MANIFEST.MFファイルの作成

- 13.7.3 サードパーティJARファイルの追加

- 13.7.4 -Xbootclasspathを使用したサードパーティJARファイルへのアクセス

- 13.7.5 外部ステージの参照

- 13.7.6 アクティブ化するOSGiバンドルのアセンブル

- 13.7.6.1 コマンドの場所、構文、引数

- 13.7.6.2 OSGiバンドルのアセンブル

- 13.8 OSGiバンドルのデプロイ

14 テスト1-2-3

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

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

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

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

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

- 14.2.1 イベント・タイプ

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

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

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

- 14.2.5 イベントのトレース

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

- 14.3 EPNシェル

- 14.3.1 Oracle CQL問合せ

- 14.3.2 管理コマンド

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

- 14.3.4 EPN変数

- 14.3.5 EPNコマンド

- 14.3.6 管理コマンド

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

- 14.4.1 セッション変数

- 14.4.2 メソッド

- 14.4.3 例

15 イベントの記録と再生を使用したデバッグ

- 15.1 イベント・フロー

- 15.2 Berkeley DB

- 15.3 イベントの記録

- 15.4 イベントの再生

- 15.5 Berkeley DBの構成

- 15.6 イベントを記録するコンポーネントの構成

- 15.7 イベントを再生するコンポーネントの構成

- 15.8 イベントの記録と再生の開始および終了

第III部 チューニングとスケーリング

16 パフォーマンス・チューニング

- 16.1 チャネルとJMSのパフォーマンス・チューニング

- 16.2 高可用性パフォーマンスのチューニング

17 高可用性アプリケーション

- 17.1 Oracle Coherence

- 17.2 アーキテクチャ

- 17.3 ライフサイクルとフェイルオーバー

- 17.3.1 セカンダリの障害

- 17.3.2 プライマリの障害およびフェイルオーバー

- 17.3.3 高可用性マルチサーバー・ドメインの再結合

- 17.4 デプロイメント・グループおよび通知グループ

- 17.5 高可用性アダプタ

- 17.5.1 高可用性入力アダプタ

- 17.5.2 バッファリング出力アダプタ

- 17.5.3 ブロードキャスト出力アダプタ

- 17.5.4 相関出力アダプタ

- 17.6 高可用性およびスケーラビリティ

- 17.7 サービス品質オプションの選択

- 17.7.1 シンプル・フェイルオーバー

- 17.7.2 バッファリングを使用するシンプル・フェイルオーバー

- 17.7.3 軽量キュー・トリミング

- 17.7.4 JMSによる正確なリカバリ

- 17.8 高可用性のためのアプリケーション設計

- 17.8.1 プライマリ高可用性のユース・ケース

- 17.8.2 高可用性の設計パターン

- 17.8.2.1 アプリケーションが許容できる最小の高可用性の選択

- 17.8.2.2 すべての入口/出口ポイントでの高可用性コンポーネントの使用

- 17.8.2.3 必要なものの保存

- 17.8.2.4 Oracle Stream Analyticsアプリケーション状態の制限

- 17.8.2.5 適切なwarm-up-window-length時間の選択

- 17.8.2.5.1 タイプ1アプリケーション

- 17.8.2.5.2 タイプ2アプリケーション

- 17.8.2.6 アプリケーションが多重呼出し不変であることの保証

- 17.8.2.7 外部のソース・イベント・アイデンティティ

- 17.8.2.8 イベント順序の重要性の理解

- 17.8.2.8.1 確定的動作の優先

- 17.8.2.8.2 マルチスレッドの回避

- 17.8.2.8.3 モノトニックなイベント識別子の優先

- 17.8.2.9 高可用性を考慮したOracle CQL問合せの記述

- 17.8.2.10 サーバーのカップリングの回避

- 17.8.2.11 サーバー・リカバリの計画

- 17.8.3 Oracle CQLの問合せの制約

- 17.8.3.1 範囲ベースのウィンドウ

- 17.8.3.2 タプルベースのウィンドウ

- 17.8.3.3 パーティション化されたウィンドウ

- 17.8.3.4 スライディング・ウィンドウ

- 17.8.3.5 DURATION句および非イベント検出

- 17.8.3.6 アプリケーション時間の優先

- 17.9 高可用性のサービス品質の構成

- 17.9.1 シンプル・フェイルオーバーの構成

- 17.9.2 バッファリングを使用するシンプル・フェイルオーバーの構成

- 17.9.3 軽量キュー・トリミングの構成

- 17.9.4 JMSによる正確なリカバリの構成

- 17.10 高可用性アダプタの構成

- 17.10.1 高可用性入力アダプタの構成

- 17.10.2 バッファリング出力アダプタの構成

- 17.10.3 ブロードキャスト出力アダプタの構成

- 17.10.4 相関出力アダプタの構成

18 スケーラブル・アプリケーション

- 18.1 デフォルト・チャネルのスケーラビリティ設定

- 18.1.1 チャネルでのパーティション化の構成

- 18.1.2 チャネルでの並列処理の構成

- 18.1.3 アップストリーム・アダプタでの並列処理の構成

- 18.1.4 ローカル・パーティション・チャネルの定義

- 18.2 着信JMSイベント・ストリームのパーティション化

- 18.2.1 高可用性のないパーティション化の構成

- 18.2.2 高可用性のあるパーティション化の構成

- 18.3 通知グループの命名規則

- 18.4 カスタム・チャネル・イベント・パーティショナ

- 18.4.1 EventPartitionerインタフェース

- 18.4.2 EventPartitionerインタフェースの実装

はじめに

このドキュメントでは、Oracle Stream Analyticsアプリケーションの作成、デプロイおよびデバッグ方法について説明します。

対象読者

このドキュメントは、Oracle Stream Analyticsアプリケーションを作成する開発者を対象としています。

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティへの取り組みについては、Oracle Accessibility ProgramのWebサイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)にアクセスしてください。

Oracleサポートへのアクセス

サポートを購入したオラクル社のお客様は、My Oracle Supportを介して電子的なサポートにアクセスできます。詳細は、http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info、聴覚に障害があるお客様はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trsを参照してください。

関連ドキュメント

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

- Oracle SOA製品の既知の問題: http://www.oracle.com//technetwork/middleware/soasuite/documentation/soaknownissues122120-3111966.html。

- Oracle Stream Analyticsの管理

- Oracle Stream Analyticsイベント処理スタート・ガイド

- Oracle Stream Analyticsスキーマ・リファレンス

- Oracle Stream AnalyticsのVisualizerの使用

- Oracle Stream Analyticsのカスタマイズ

- Oracle CQLデータ・カートリッジによるアプリケーションの開発

- Oracle CQL言語リファレンス

- Oracle Stream Analytics Java APIリファレンス

- Oracle Stream Analyticsの使用

- Oracle Stream Analyticsスタート・ガイド

- Oracle Database SQL言語リファレンス: http://docs.oracle.com/cd/E16655_01/server.121/e17209/toc.htm

- SQL99仕様(ISO/IEC 9075-1:1999、ISO/IEC 9075-2:1999、ISO/IEC 9075-3:1999およびISO/IEC 9075-4:1999)

- Oracle Stream Analyticsフォーラム: http://forums.oracle.com/forums/forum.jspa?forumID=820

表記規則

このマニュアルでは次の表記規則を使用します。

表記規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

このガイドで説明する新機能

使用しているスキンによっては、このガイドで示される画面は実装状態と異なる場合があります。相違点は軽微なものです。

このガイドでは、12c 12.2.1リリース用に次ような変更が行われています。

- Oracle Stream ExplorerからOracle Stream Analyticsに製品名が変更されました。

- 新しいアダプタがサポートされています。

- QuickFixアダプタのサポートは非推奨となりました。

第I部 アプリケーションの開発

第I部は以下の章で構成されます。

- アプリケーションの開発の概要

- アプリケーションおよびリソース構成

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

- アダプタ

- チャネル

- Oracle CQLプロセッサ

- イベントBean

- キャッシュ済イベント・データ

- Webサービス

- パラメータ化されたアプリケーション

1 アプリケーションの開発の概要

Oracle Stream Analyticsアプリケーションは、ストリーミング・データをリアルタイムで監視および処理します。ストリーミング・データは、アプリケーションの内外にフローしたり、アプリケーションを通過してフローします。RAWデータはアプリケーション内へフローし、イベントに変換されます。イベントは、アプリケーションの要件に従って処理およびフィルタリングを行うために、アプリケーション・ステージを通過してフローします。最終的にアプリケーションは、宛先(格納、Webページでの表示、別のアプリケーションによる追加処理など)に適した形式のデータに戻るように、処理およびフィルタリング済のイベントを変換します。

Oracle Stream Analyticsアプリケーションの開発が初めての場合は、『Oracle Stream Analyticsイベント処理スタート・ガイド』のイベント処理の概要に関する項から開始してください。スタート・ガイドは、Oracle Stream Analyticsの概要を示し、実践的なウォークスルーを提供し、サンプルのアプリケーションについて説明します。このガイドでは、プラットフォームで提供されているコンポーネントでOracle Stream Analyticsアプリケーションを作成、構成およびデプロイする方法について説明します。カスタマイズされたアダプタまたはイベントBeanを使用してアプリケーションを構築する必要がある場合は、『Oracle Stream Analyticsのカスタマイズ』のカスタム・アダプタに関する項を参照してください。

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

- EPN図

- コンポーネント構成

- ストリームとリレーション

- アプリケーションのスケーラビリティおよび高可用性

- アプリケーション・ライフサイクル

- APIの概要

- Springフレームワーク

- OSGiサービス・プラットフォーム

1.1 EPN図

イベント処理ネットワーク(EPN)アプリケーション・モデル上のOracle Stream Analyticsアプリケーション開発センター。EPN図は、イベントがOracle Stream Analyticsアプリケーション内にフローし、内部をフローし、アプリケーション外にフローする様子を表します。EPN図をOracle JDeveloper内でアセンブルするには、EPNコンポーネントを選択および構成し、必要に応じてロジックを指定します。EPN図では、イベント・データは左から右にフローします。

図は、TradeReportアプリケーションのEPN図を示します。データは、カンマ区切りの値(CSV)形式でデータを処理する、左側のStockTradeCSVAdapterを介してEPNに入ります。StockTradeCSVadapterロジックにより、受信CSVデータがOracle Stream Analyticsイベントに変換されます。AdapterOutputChannelは、新しく生成されたイベントをOracle CQLプロセッサに送信します。

GetHighVolumeProcessorコンポーネントは、イベントがストリームする際に問合せを行い、4000を超えるボリュームがある株式の取引を選択します。ProcessorOutputChannelコンポーネントは、選択したイベントをListenerBeanコンポーネントに送信し、ListenerBeanコンポーネントは銘柄記号およびボリューム情報をコマンド行に出力します。

『Oracle Stream Analyticsイベント処理スタート・ガイド』のOracle Stream Analyticsプロジェクトの作成に関する項では、Oracle JDeveloperを使用してOracle Stream Analyticsアプリケーションを作成する方法について説明しています。TradeReportアプリケーションおよび不正検出アプリケーションのウォークスルーも含まれます。

1.2 コンポーネント構成

Oracle Stream Analyticsアプリケーションを開発する場合、コンポーネントのネットワークをアセンブルしてEPNに構成します。

各コンポーネントには、データの処理におけるロールがあります。次の各項では、EPNコンポーネントとそれらのロールについて説明します。

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

イベント・タイプは、イベントに含まれるデータを定義するデータ構造です。イベント・タイプにより、イベント・データがEPN内をフローする方法やそれに対して実行できる操作が決まるため、イベント・タイプはEPNの基礎です。アプリケーションを起動して最初に行うことは、EPNのイベント・タイプを作成することです(アダプタ、チャネル、リレーショナル・データベース表、ビッグ・データ・ストレージなどのコンポーネントを適切なイベント・タイプで構成する必要があるため)。

アダプタ

Oracle Stream Analyticsには、EPNの内外にフローする可能性があるすべてのタイプのデータを収容するために様々な入力アダプタおよび出力アダプタが用意されています。たとえば、Java Message Service (JMS)オブジェクト、HTTPパブリッシュ/サブスクライブ・サーバーおよび金融市場フィードにアクセスできます。デフォルトでサポートされていないシステムを統合する固有のアダプタも開発できます。『Oracle Stream Analyticsビジュアライザの使用』のイベント・タイプ・リポジトリの構成に関する項を参照してください。

アダプタは、イベント・タイプおよび他の関連構成情報を使用して構成します。特定の構成は、アダプタがイベントの入力または出力およびデータのソースを処理するかどうかに依存します。たとえば、TradeReportアプリケーションでは、入力CSVアダプタの構成により、CSVファイルの場所が指定されたり、CSVファイルの読取りを開始するタイミングや連続する読取り間で待機する時間をアダプタに伝える値が指定されます。

チャネル

イベント・タイプを使用してチャネルを構成することにより、そのタイプのイベントがその特定のイベント・タイプに適したEPN内の次のステージに転送できるようにします。チャネルは、ストリームまたはリレーションのいずれかを示します。

ストリームまたはリレーション・チャネルにより、イベントがコレクションに挿入され、結果のストリームは次のEPNステージに送信されます。ストリーム内のイベントをこのストリームから削除することはできません。リレーション内のイベントは、リレーションに挿入、リレーションから削除、およびリレーションで更新することができます。挿入、削除および更新の各操作では、リレーション内のイベントは常に特定の時点に関連付けられている必要があります。詳細は、ストリームとリレーションを参照してください。

Oracle CQLプロセッサ

Oracle CQL問合せコードを使用してOracle CQLプロセッサを構成することにより、通過するイベントを調査します。Oracle JDeveloperのコンポーネント・ウィンドウには、Oracle CQL問合せを作成しやすくするためのCQLパターンが用意されています。各CQLパターンのウィザードでは、有効なOracle CQL問合せを確実に構築するために正しい構成データを指定するよう求められます。

Bean

Beanは、標準のSpringベースのBeanに準拠するJavaプログラミング言語で書かれたアプリケーション・イベント・ロジックを定義します。

イベントBeanは、イベントをリスニングまたは操作するロジックを実装するJavaクラスです。このタイプのJavaクラスはリスナーJavaクラスと呼ばれます。イベントを受信するリスナー(イベント・シンク)は、特定のタイプのデータを検出したときに新しいイベントを作成したり、この新しいイベントをさらに処理するために次のステージに送信できます。また、リスナー・イベント・シンクは、イベント・データに基づいて同じアプリケーションや別のアプリケーションで他のプロセスを開始することもできます。

Spring Beanは、Springフレームワークで管理され、Beanを既存のSpringデプロイメントに統合する場合に適切な選択肢です。イベントBeanでは、Oracle Stream Analyticsサーバーで管理できるように、Beanの構成にOracle Stream Analyticsの規則を使用します。たとえば、イベントBeanでは、監視やイベントの記録および再生などのOracle Stream Analyticsサーバー機能のサポートを取得します。イベントの記録と再生は、アプリケーションのデバッグに使用できます。

キャッシング

アプリケーションで使用するデータおよびイベント・データのソースまたは宛先としてキャッシュを使用できるよう、キャッシュ・システムとOracle Stream Analyticsプリケーションを統合できます。キャッシュを統合すると、ストリーミング・データを処理するアプリケーションに適切な速度で比較的に静的なデータにアクセスできます。

キャッシュは、イベントを格納する一時記憶域で、Oracle Stream Analyticsアプリケーションの全体的なパフォーマンスを改善することを目的として作成できます。キャッシュは、アプリケーションが正常に機能するためには必要ありません。イベントの可用性を高め、アプリケーションのパフォーマンスを向上するために、Oracle Stream Analyticsアプリケーションでは、イベントをキャッシュにパブリッシュしたり、キャッシュにあるイベントを使用したりできます。

キャッシング・システムは、構成済キャッシュの名前付きセットを定義します。Oracle Stream Analyticsは、複数のサーバーにリモート・キャッシュ通信用の構成を配分します。Springコンテキスト・ファイルは、キャッシング構成をサポートしています。Springコンテキスト・ファイルを使用して構成されたリスナーは、キャッシュからイベントを受信します。

データ関連コンポーネント

表: 表コンポーネントは、リレーショナル・データベースへのアクセスを提供します。ID、イベント・タイプおよびデータ・ソースを使用して表コンポーネントを構成することにより、特定のイベントをリレーショナル・データベース表にフィードします。Oracle Stream Analyticsには、ビッグ・データ・ストレージにアクセスするためにHadoopおよびNoSQLDBデータ・カートリッジが用意されています。

Hadoop: Hadoop Distributed File System (HDFS)内の大量のデータにアクセスするためのOracle CQLプロセッサのデータ・カートリッジ拡張機能です。HDFSは、非リレーショナル・データ・ストアです。Oracle CQLプロセッサには、ビッグ・データにアクセスするためのOracle CQL問合せコードが用意されています。Hadoopは、ID、イベント・タイプ、データベースへのパスおよびファイル・セパレータ文字を使用して構成します。

NoSQLDB: Oracle NoSQL Database内の大量のデータにアクセスするためのOracle CQLプロセッサのデータ・カートリッジ格納機能です。Oracle NoSQLDB Databaseには、キー/値のペアでデータが格納されます。Oracle CQLプロセッサには、ビッグ・データにアクセスするためのOracle CQL問合せコードが用意されています。NoSQLDBは、ID、イベント・タイプ、ストア名およびストアの場所を使用して構成します。

1.3 ストリームとリレーション

Oracle Stream Analyticsアプリケーションは、RAWイベント・データとしてストリームに到達するイベントを処理します。RAWイベント・データは、RAWイベント・データをイベントに変換するアダプタを介してEPNに入ります。イベントは、順序が付けられた一連の値(タプル)です。

イベントにはスキーマがあるという点において、イベントはリレーショナル・データベース内の表の列と似ています。イベント・スキーマにより、各イベント値のプロパティおよびタイプが定義されます。表の列には静的データが含まれるという点において、イベントはデータベース内の表の列とは異なります。イベントのストリームでは、別のイベントの前後のイベントの到着を含むイベントが到着する時間が重要になります。アプリケーションで時間および順序を把握できる必要があります。

たとえば、株式取引を処理するアプリケーションでは、銘柄記号、価格、終値、変化率およびボリューム情報で構成されるイベントは、各取引を実行した順序で順に到着します。アプリケーションのロジックでは、別の取引の直後に発生した株式の取引を検索する場合があります。

イベント処理アプリケーションでは、イベントがストリームで発生する順序は、各イベント・プロパティのデータ型および値と同じように重要です。Oracle Stream Analyticsプログラミングの規則は、時間および順序の重要性を反映します。

コードにより、特定の基準(銘柄記号など)に基づいて相互に関連するイベントを検出する必要があります。また、コードにより、順序パターン(他の取引から15秒以内に行われた取引など)も検出する必要があります。イベント・データのシーケンシャルおよびリレーショナルな側面を説明するために、Oracle Stream Analyticsは待機時間の短いチャネルを介してストリームおよびリレーションの概念を実装します。

- ストリームは、ほぼ無制限の連続するイベントで、この場合、各イベントには独自のタイムスタンプがあります。ストリーム内では、あるイベントから次のイベントに移るときにタイムスタンプの値が減少しないように、イベントを時間をキーにして並べる必要があります。同じタイムスタンプを持つイベントが1つのストリーム内に存在する場合もあります。

- リレーションでは、順序は重要でない場合があります。かわりに、リレーション内のイベントは特定の基準を満たしており、関連しています。たとえば、リレーション内のイベントは、問合せで特定のレベルを超える取引量を検索したときに株式取引のストリームに対して実行された問合せの結果である場合があります。

株式取引イベントのストリームでは、イベントは順に到着し、各イベントには独自のタイムスタンプがあります。他の取引から5秒以内に行われた取引の株価を分離するには、次のOracle CQLコードを使用して、ストリームがチャネルから到着するときにストリームを問い合せるようOracle CQLプロセッサを構成します。

select price from StockTradeChannel [range 5 seconds]

問合せでは[range 5 seconds]期間を使用してイベントを分離するため、この問合せの出力はリレーションです。問合せから返されたイベントにはタイムスタンプがありますが、リレーションで順序付けされません。着信イベントはストリーム内にあるため、問合せは、5秒分のイベントがOracle CQLプロセッサに渡されるたびに継続的に実行されます。新しいイベントが到着すると、問合せの条件を満たすイベントはリレーションに挿入されますが、問合せの条件を満たさないイベントはリレーションから削除されます。

ストリーム内の順序の整合性は重要であるため、このことは重要です。技術的には、ストリームは継続的に移動する順序付けされた一連のイベントです。ストリーム内では、すべてのイベントは順にストリームに挿入されます。CQL問合せからストリームのサブセットを取得した場合、順序は必要ありません。EPNの次のステージにリレーションを渡す前に、IStream演算子を使用してリレーションをストリームに再変換できます。

1.4 アプリケーションのスケーラビリティおよび高可用性

スケーラブルなOracle Stream Analyticsアプリケーションには、イベントの負荷が増加するにつれてアプリケーションの動作がスケーリングされるように、実装規則と構成規則を含むOracle Stream Analyticsの設計パターンが組み込まれています。

スケーラビリティおよび高可用性を実現するには、アプリケーションの設計パターン、サーバー・リソースおよび構成規則を統合することにより、ソフトウェアやハードウェアに障害が発生した場合でもデプロイしたアプリケーションが動作し続けるようにします。

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

高可用性アプリケーション

スケーラブル・アプリケーション

1.5 アプリケーション・ライフサイクル

図1-1は、Oracle Stream Analyticsアプリケーション・ライフサイクルの状態図を示します。この図では、状態名(STARTING、INITIALIZING、RUNNING、SUSPENDING、SUSPENDEDおよびFAILED)がApplicationRuntimeMBeanメソッドgetState戻り値に対応します。このような状態はOracle Stream Analytics専用です。これらはOSGiバンドルの状態ではありません。

図1-1 Oracle Stream Analyticsアプリケーション・ライフサイクルの状態図

注:

Oracle Stream Analyticsサーバー・ライフ・サイクルの詳細は、Oracle Stream Analyticsの管理のサーバー・ライフ・サイクルに関する項を参照してください。

この項では、Oracle Stream Analyticsサーバーにデプロイされたアプリケーションのライフサイクルと、com.bea.wlevs.ede.apiAPIコールバックのシーケンスについて説明します。ここでは、アプリケーション内でライフサイクルAPIをより効率的に使用できるようにOracle Stream Analyticsでアプリケーションのライフサイクルがどのように管理されるかについて説明します。これらのライフサイクルAPI (RunnableBeanやSuspendableBeanなど)の詳細は、次を参照してください。

- APIの概要

- Oracle Stream Analytics Java APIリファレンス

ライフサイクルの説明は、次の項に記載されているアクションを含むユーザーが実行するアクションに分類されます。

アプリケーションのインストールまたはアプリケーションがデプロイされた状態でのサーバーの起動

Oracle Stream Analyticsでは、次のアクションが実行されます。

1. Oracle Stream Analyticsで、OSGIバンドルとしてアプリケーションがインストールされます。OSGIでインポートおよびエクスポートが解決され、サービスがパブリッシュされます。

2. Oracle Stream Analyticsにより、(標準のSpring BeanとEPNアセンブリ・ファイル内のOracle Stream Analyticsタグに対応するSpring Beanの両方について) Beanが作成されます。Beanごとに、Oracle Stream Analyticsで次のアクションが実行されます。

- Spring Beanのプロパティが設定されます。<wlevs:instance-property>値はアダプタおよびイベントBeanで設定されます。

- @Serviceまたは@ServiceReference注釈で指定されたサービスに適切な依存関係がインジェクションされます。

- 静的な構成プロパティに適切な依存関係が注入されます。

- InitializingBean.afterPropertiesSetメソッドが呼び出されます。

- 構成コールバック(@Prepare、@Activate)がSpring Beanおよびファクトリで作成されたステージで呼び出されます。
詳細は、リソース・アクセス構成を参照してください。

3. アプリケーションの現在の状態はINITIALIZINGです。

4. Oracle Stream AnalyticsでMBeanが登録されます。

5. Oracle Stream Analyticsで、すべてのActivatableBeansのActivatableBean.afterConfigurationActiveメソッドが呼び出されます。

6. Oracle Stream Analyticsで、すべてのResumableBeansのResumableBean.beforeResumeメソッドが呼び出されます。

7. RunnableBeanを実装する各Beanについて、Oracle Stream Analyticsでスレッドでの実行が開始されます。

8. アプリケーションの現在の状態はRUNNINGです。

アプリケーションの一時停止

Oracle Stream Analyticsでは、次のアクションが実行されます。

1. Oracle Stream Analyticsで、すべてのSuspendableBeansのSuspendableBean.suspendメソッドが呼び出されます。

2. アプリケーションの現在の状態はSUSPENDEDです。

アプリケーションの再開

Oracle Stream Analyticsでは、次のアクションが実行されます。

1. Oracle Stream Analyticsで、すべてのResumableBeansのResumableBean.beforeResumeメソッドが呼び出されます。

2. RunnableBeanを実装する各Beanについて、スレッドでの実行が開始されます。

3. アプリケーションの現在の状態はRUNNINGです。

アプリケーションのアンインストール

Oracle Stream Analyticsでは、次のアクションが実行されます。

1. Oracle Stream Analyticsで、すべてのSuspendableBeansのSuspendableBean.suspendメソッドが呼び出されます。

2. Oracle Stream AnalyticsでMBeanが登録解除されます。

3. すべてのDisposableBeansのDisposableBean.disposeメソッドが呼び出されます。

4. Oracle Stream Analyticsで、OSGIからアプリケーション・バンドルがアンインストールされます。

アプリケーションの更新

これは、最初にアプリケーションをアンインストールしてから再びインストールするのと同等です。

このリストのユーザー・アクションを参照してください。

ストリームおよびリレーション・ソースおよびシンクのメソッドの呼出し

ライフサイクル・コールバックからストリーム、リレーション・ソースまたはシンクに対してメソッドを呼び出すことはできません。これは、これらのアプリケーション・ライフサイクルのフェーズが完了するまではコンポーネントがイベントを受信する準備が整わない可能性があるためです。

たとえば、afterConfigurationActiveまたはbeforeResumeなど、ライフサイクル・コールバックからStreamSenderメソッドのsendInsertEventを呼び出すことはできません。

RunnableBeanを実装するBeanの実行メソッドから、ストリーム、リレーション・ソースまたはシンクでメソッドを呼び出すことができます。

イベントBeanを参照してください。

1.6 APIの概要

APIを使用すると、このドキュメント・セットで説明されているようにOracle Stream Analyticsアプリケーション全般について機能をプログラムで実装できます。

この項では、使用目的の観点からAPIパッケージの概要を示します。また、この項には、詳細を確認できる場所を示す相互参照も含まれます。

すべてのクラスおよびインタフェースの詳細な参照ドキュメント(Javadoc)は、Oracle Stream Analytics Java APIリファレンスを参照してください。『Oracle Stream Analyticsイベント処理スタート・ガイド』のOracle Stream Analytics APIsのサンプルに関する項も参照してください。

- 構成

- アダプタ

- チャネルイベント・リポジトリ

- イベントドリブン環境

- イベントBeanライフサイクル

- JAXB

- キャッシング

- キャッシュ・ローダー

- クラスタ・グループ管理

- 管理Bean

- 高可用性

- テスト・ツールおよびユーティリティ・ツール

- カートリッジ・フレームワーク

- Springのサポート

構成

com.bea.wlevs.configurationパッケージには、構成オブジェクトをアクティブ化、準備およびロールバックするためのインタフェースが用意されています。Prepareインタフェースを実装する場合、構成オブジェクトを受け入れ、チェックおよび格納するためのメソッドを指定します。構成オブジェクトのJavaタイプはJAXBによって決定されます。デフォルトでは、Javaクラス名は、適用可能なステージの構成データを表すXMLスキーマの複合タイプの名前と同じです。スキーマの詳細は、/Oracle/Middleware/my_oep/oep/ xsd/wlevs_application_config.xsdスキーマを参照してください。アプリケーションおよびリソース構成も参照してください。

アダプタ

Oracle Stream Analyticsには、アダプタの動作を管理するためのインタフェースおよびクラスを備えた複数のパッケージが用意されています。アダプタを参照してください。

パッケージ:

- com.bea.wlevs.adapters.httppubsub.apiパッケージは、インバウンドJavaScript Object Notation (JSON)メッセージをイベント・タイプに変換して再度戻すためのインタフェースを提供します。インバウンドおよびアウトバウンドのJSONメッセージをイベント・タイプに変換してJSON形式に戻す方法をカスタマイズするには、カスタム・コンバータBeanを作成し、このAPIを使用します。

- com.bea.wlevs.adapters.httppubsub.supportパッケージには、HTTPパブリッシュ/サブスクライブ・サーバーへの接続を確立するためのクラスが用意されています。

- com.bea.wlevs.adapters.jms.apiパッケージには、インバウンドJMSメッセージをイベント・タイプに変換して再度戻すためのインタフェースが用意されています。インバウンドおよびアウトバウンドのJMSメッセージをイベント・タイプに変換して再度戻す方法をカスタマイズするには、カスタム・コンバータBeanを作成し、このAPIを使用します。

- com.bea.wlevs.ede.apiパッケージには、カスタム・アダプタを作成するためのインタフェースが用意されています。『Oracle Fusion Middleware Oracle Stream Analyticsコンポーネントのカスタマイズ』を参照してください。

チャネル

com.bea.wlevs.channelパッケージには、イベントのパーティションを実装するためのインタフェース、およびチャネル内のイベントの数を管理するためのクラスが用意されています。チャネルおよびスケーラブル・アプリケーションを参照してください。

イベント・リポジトリ

イベントおよびイベント・タイプを管理するために、Oracle Stream Analyticsでは、イベント・ストア・リポジトリおよびイベント・タイプ・リポジトリを使用します。イベント・ストア・リポジトリではイベントが永続化され、イベント・タイプ・リポジトリではイベント・タイプが永続化されます。

パッケージ:

- com.bea.wlevs.eventstoreパッケージには、イベント・ストア・リポジトリを管理するためのインタフェースおよびクラスが用意されています。『Oracle Stream Analyticsビジュアライザの使用』の永続イベント・ストアに関する項を参照してください。

- com.bea.wlevs.ede.apiパッケージには、イベント・タイプ・リポジトリを管理するためのEventTypeRepositoryインタフェースが用意されています。イベントおよびイベント・タイプを参照してください。

イベントドリブン環境

com.bea.wlevs.ede.apiパッケージには、イベントに反応するOracle Stream Analyticsアプリケーション・コードを作成およびカスタマイズするためのインタフェースが用意されています。このパッケージには、イベントBeanおよびアダプタを作成し、これらをイベント・シンクおよびイベント・ソースに設定するためのインタフェースが用意されています。このパッケージの他のインタフェースを使用すると、イベントがEPN内をフローする方法に関するすべての側面を管理できます。これには、イベント作成、イベント・フロー・スルー・チャネル、イベント・メタデータおよびプロパティ、イベント・タイプ・リポジトリ、外部データ・ソース、EPNステージ、フォルト処理、イベントBeanライフサイクルなどがあります。

これらの一部のAPIを使用するサンプルJavaコードは、イベントおよびイベント・タイプ およびイベントBeanを参照してください。Oracle Stream Analytics注釈およびデプロイメントXMLを使用したリソース・インジェクションの構成の詳細は、リソース・アクセス構成も参照してください。

イベントBeanライフサイクル

com.bea.wlevs.ede.apiパッケージを使用すると、イベントBeanライフサイクルを制御することもできます。イベントBeanの初期化の管理、動的アクティブ化の構成、スレッドの使用、処理の一時停止と再開、アプリケーションのアンデプロイ時のリソースのリリースを実行できます。イベントBeanおよびアプリケーション・ライフサイクルの詳細は、アプリケーション・ライフサイクルを参照してください。

Springフレームワークによって同様のBeanライフサイクルインタフェースが実行されることに注意してください。ただし、同等のSpringインタフェースを使用してもファクトリによって作成されたBeanを操作することはできず、一方でOracle Stream Analyticsインタフェースではこの操作が可能です。

JAXB

Oracle Stream Analyticsには、アダプタおよびイベントBeanでJava Architecture for XML Binding (JAXB)マッピング機能を使用してXMLオブジェクトとJavaオブジェクト間でイベント・データをマーシャリングおよびアンマーシャリングするための簡易インタフェースが用意されています。「JAXBサポート」を参照してください。

パッケージ:

- com.oracle.cep.mappers.apiパッケージには、ほとんどのアプリケーション要件に応じてイベント・データをマーシャリングおよびアンマーシャリングするためのインタフェースが用意されています。

- com.oracle.cep.mappers.jaxbパッケージには、マーシャリングおよびアンマーシャリング用の特別なメソッド・シグネチャを備えたインタフェースが用意されています。

キャッシュ

アプリケーションがイベント・データにアクセスできるようにキャッシング・システムを構成できます。Oracle Coherence分散キャッシング、Oracle Stream Analyticsローカル・キャッシングおよびサードパーティ提供のキャッシング・ソリューションを組み合せてシステムのキャッシュを構成できます。Oracle CQLおよびJavaクラスを使用してキャッシュのイベントにアクセスできます。キャッシュ済イベント・データを参照してください。

パッケージ:

- com.bea.wlevs.cache.spiパッケージには、Oracle Stream Analyticsアプリケーションが使用可能なキャッシング・システムを作成できるインタフェースが用意されています。

- com.bea.wlevs.cache.spi.coherenceパッケージには、Oracle Coherenceキャッシュを組み込むためにキャッシング・システムを拡張できるインタフェースが用意されています。

キャッシュ・ローダー

com.oracle.cep.cacheloader パッケージは、CSVイベントをCoherenceキャッシュにロードするためのCsvCacheLoaderクラスを提供します。キャッシュ済イベント・データを参照してください。

クラスタ・グループ管理

com.bea.wlevs.ede.api.clusterパッケージには、マルチサーバー・ドメイン(クラスタ)内のサーバー・グループを管理するためのインタフェースが用意されています。構成に関する情報の取得、クラスタ・メンバーシップの変更をリスニングするためのイベントBeanおよびアダプタの実装、EPNを含めるためのグループ名の設定、およびグループ・サーバーに関する情報の取得を行うことができます。Oracle Stream Analyticsの管理のサーバー・グループに関する項を参照してください。

管理Bean

管理Bean (MBean)を使用すると、タスクを実行するための構成およびランタイム情報にプログラムからアクセスできます。MBean (タスク)には、構成とランタイムの2つのタイプがあります。構成MBeanには、EPNコンポーネントの構成に関する情報が含まれます。ランタイムMBeanには、コンポーネントのスループットと待機時間に関する情報が含まれます。Oracle Stream Analyticsの管理のMBean管理コマンドに関する項を参照してください。

パッケージ:

- com.bea.wlevs.managementパッケージには、クライアント・アプリケーションによって使用される定数を管理するためのインタフェースや、すべてのOracle WebLogic Event Server MBean用のスーパーインタフェースが用意されています。

- com.bea.wlevs.management.configurationパッケージには、アプリケーション、アダプタ、キャッシュ、構成、Oracle CQLプロセッサ、イベントBean、ステージ、ストリーム、表シンクおよびソースを管理するためのインタフェースが用意されています。

- com.bea.wlevs.management.diagnosticパッケージには、診断プロファイルを管理するためのインタフェースが用意されています。診断プロファイルは、スループットおよび待機時間をテストするためのアプリケーション・ステージ情報が含まれるXMLファイルです。『Oracle Stream Analyticsビジュアライザの使用』のスループットおよび待機時間の監視に関する項を参照してください。

- com.bea.wlevs.management.diagnostic.notificationパッケージには、バックグラウンド・プローブによって送信された診断変更通知をラップするためのクラスが用意されています。

- com.bea.wlevs.diagnosticパッケージには、新しくデプロイされたアプリケーションおよび削除されたアプリケーションをリスニングするためのインタフェースとクラスが用意されています。アプリケーションがデプロイおよびアンデプロイされると、プロファイル・マネージャ(診断プロファイルのグループ)も作成および削除され、対応するプロファイル・マネージャ・イベントが発行されます。

- com.bea.wlevs.management.runtimeパッケージには、アプリケーション、アプリケーションOracle CQLプロセッサ、ドメイン、サーバーおよびEPNステージに関するランタイム情報を取得するためのインタフェースが用意されています。

- com.bea.wlevs.monitorパッケージには、イベント・サーバー内のアプリケーション・エンドポイントのスループットおよび待機時間を監視するためのインタフェースが用意されています。

- com.bea.wlevs.monitor.managementパッケージには、アプリケーション・ステージの監視メトリックを受信するためのインタフェース、およびEPN内のエンドポイント間の待機時間を監視するためのインタフェースが用意されています。

- com.bea.wlevs.deployment.mbeanパッケージには、アプリケーションのデプロイを管理するためのインタフェースが用意されています。

- com.bea.wlevs.eventinspector.managementパッケージには、イベント・トレースとイベント・インジェクションの動作を制御するためのインタフェースおよびクラスが用意されています。「テスト1-2-3」を参照してください。

- com.oracle.cep.cluster.ha.adapter.managementパッケージには、高可用性環境におけるJMX通信を管理するためのインタフェースおよびクラスが用意されています。

高可用性

Oracle Stream Analyticsは、アプリケーション設計パターンと高可用性アダプタによって、アプリケーションのバックアップおよびフェイルオーバー処理の能力を強化します。高可用性アプリケーションを参照してください。

パッケージ:

- com.oracle.cep.cluster.ha.adapterパッケージには、キュー・トリミング用のインタフェースおよびクラスが用意されています。

- com.oracle.cep.cluster.ha.adapter.inboundパッケージには、高可用性ブロードキャスト・インバウンド・アダプタを作成するためのクラスが用意されています。このアダプタは、システム時間を使用し、高可用性が求められるアプリケーション用です。

- com.oracle.cep.cluster.ha.adapter.managementパッケージには、高可用性環境におけるJMX通信を管理するためのインタフェースおよびクラスが用意されています。

- com.oracle.cep.cluster.ha.adapter.runtimeパッケージには、他の高可用性インタフェースに対するJMXインタフェースを管理するためのインタフェースおよびクラスが実装されています。

- com.oracle.cep.cluster.ha.apiパッケージには、簡単なフェイルオーバー機能用のインタフェースおよびクラスが用意されています。

- com.oracle.cep.cluster.hagroupsパッケージには、プロパティ・グループ・メンバーシップの変更をリスニングし、変更を使用可能にし、ブロードキャスト・グループ・メンバーに対するサブスクリプションを可能にするイベントBeanおよびアダプタを作成するためのインタフェースおよびクラスが用意されています。

- com.oracle.cep.cluster.hagroups.runtimeパッケージには、通知グループ情報を取得するためのインタフェースおよびクラスが用意されています。

テスト・ツールおよびユーティリティ・ツール

Oracle Stream Analyticsには、対象と方法に応じて、アプリケーションをテストする様々な方法があります。「テスト1-2-3」を参照してください。

パッケージ:

- com.bea.wlevs.eventinspector.managementパッケージには、イベントのトレースとインジェクションを管理するためのインタフェースおよびクラスが用意されています。

- com.oracle.cep.shellパッケージには、Oracle Stream Analyticsアプリケーションをテストするためのコマンドをプログラムから呼び出すためのインタフェースおよびクラスが実装されています。

- com.bea.wlevs.utilパッケージには、OSGiサービス参照を必須としてメソッドをマークし、エラー・メッセージを取得および設定し、パラメータを解析し、OSGiインポータ・サービスのカーディナリティを戻し、サービス・クラスをロードするためのインタフェースおよびクラスが実装されています。

カートリッジ・フレームワーク

com.oracle.cep.cartridgeパッケージには、データ・カートリッジ・フレームワークを構成するインタフェースおよびクラスが用意されています。データ・カートリッジ・フレームワークは、ユーザーおよびベンダーがOracle CQL機能を拡張するためにカートリッジを作成できるようにするService Provider Interface (SPI)です。『Oracle CQLデータ・カートリッジによるアプリケーションの開発』のOracle CQLデータ・カートリッジ・フレームワークに関する項を参照してください。

Springのサポート

com.bea.wlevs.spring.supportパッケージには、Oracle Stream AnalyticsアプリケーションでSpringの機能を使用するためのインタフェースおよびクラスが用意されています。

1.7 Springフレームワーク

Springフレームワークには、移植可能で柔軟性の高いエンタープライズ・アプリケーションを作成するために使用できる、JavaベースのAPIと構成モデルが用意されています。

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

- SpringフレームワークAPI 3.1.1:http://docs.spring.io/spring/docs/3.1.1.RELEASE/javadoc-api/

- Springフレームワーク - 参照ドキュメント3.1:http://docs.spring.io/spring/docs/3.1.1.RELEASE/spring-framework-reference/html/

1.8 OSGiサービス・プラットフォーム

OSGiサービス・プラットフォームには、OSGIバンドル(モジュール)を動的にインストール、更新または削除できる動的アプリケーション実行環境が用意されています

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

- OSGiリリース4サービス・プラットフォームJavadoc: http://www.osgi.org/Release4/Javadoc

- OSGiリリース4コア仕様: https://www.osgi.org/developer/specifications/

サービス注釈

com.bea.wlevs.util.Service (@Service)注釈では、OSGiサービス参照が挿入されたコンポーネントのメソッドを指定します。通常、このアノテーションは、必要に応じてJavaBeanセッター・メソッドに追加します。@Service注釈には次の属性があります。

表1-1 com.bea.wlevs.util.Service JWS注釈タグの属性

名前

説明

データ型

必須?

serviceBeanName

挿入されたサービスをサポートするBeanの名前。nullに設定できます。

String

いいえ

cardinality

この属性の有効な値は次のとおりです:

- ServiceCardinality.C0__1

- ServiceCardinality.C0__N

- ServiceCardinality.C1__1

- ServiceCardinality.C1__N

デフォルト値はServiceCardinality.C1__1です。

enum

いいえ

contextClassloader

この属性の有効な値は次のとおりです:

- ServiceClassloader.CLIENT

- ServiceClassloader.SERVICE_PROVIDER

- ServiceClassloader.UNMANAGED

デフォルト値はServiceClassloader.CLIENTです。

enum

いいえ

timeout

サービス解決のタイムアウト(ミリ秒単位)。

デフォルト値は30000です。

int

いいえ

serviceType

挿入するサービスのインタフェース(またはクラス)。

デフォルト値はService.classです。

Class

いいえ

filter

一致するサービスを絞り込むフィルタを指定します。値はnullでもかまいません。

String

いいえ

次の例は、@Service注釈の使用方法を示しています。その他の例は、イベント・タイプ・リポジトリへのアクセスを参照してください。

@Service(filter = "(Name=StockDs)")
public void setDataSourceService(DataSourceService dss) {
initStockTable(dss.getDataSource());
}

2 アプリケーションおよびリソース構成

Oracle Stream AnalyticsのEPNには、アセンブリ・ファイルとコンポーネント構成ファイルという2つのタイプの構成ファイルがあります。アセンブリ・ファイルは、EPNダイアグラム・ステージおよび構造を記述するコンテキスト・ファイルです。構成ファイルには、EPNステージのコンポーネント構成および動的パラメータが記述されます。動的パラメータは、Oracle Stream Analytics Visualizerを使用して実行時に、またはJMX APIを介してプログラムで変更できるパラメータです。

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

- アプリケーション構成

- アセンブリ・ファイル構造

- コンポーネント構成ファイル構造

- コンポーネントおよびサーバー構成

- リソース・アクセス構成

2.1 アプリケーション構成

Oracle Stream Analyticsアプリケーション構成の設定は、標準スキーマに基づくXMLファイルに格納されます。Oracle Stream Analyticsをインストールすると、スキーマのXSDファイルはOracle/Middleware/oep/xsdディレクトリにインストールされます。

デフォルトでは、Oracle JDeveloperにより、<Project-Name>.context.xmlという名前のアセンブリ・ファイルが1つ、processor.xmlという名前のデフォルトの構成ファイルが1つ生成されます。1つのアプリケーションには、1つ以上のアセンブリ・ファイルと1つ以上の構成ファイルを指定できます。使用する構成ファイルの数、およびEPNの構築時にこれらに付ける名前を決定します。プロジェクトには、Oracle CQLプロセッサ構成の設定を格納するためにprcessor.xmlという名前の構成ファイルが1つ必要です。

アダプタなどのコンポーネントを作成する場合、processor.xmlファイルは、新しいコンポーネント・ウィザード内にデフォルトの構成ファイルとして表示されます。デフォルト設定を採用すると、コンポーネント構成情報はデフォルトのprocesor.xmlに格納されます。adapter.xmlという名前の1つのファイルにアダプタ構成をすべて格納するには、ウィザードでprocessor.xmlをadapters.xmlに変更します。

コンポーネント構成ウィザードで、adapters.xmlなどの新しいファイル名を指定するがデフォルトの設定のみを使用する場合、この新しいファイルに格納する構成設定が存在しないため、Oracle JDeveloperではこのファイルは生成されません。カスタム設定を使用してコンポーネントを再作成することも、「ファイル」メニューを使用して空の構成ファイルを新しく作成することもできます。『Oracle Stream Analyticsイベント処理スタート・ガイド』のコンポーネント構成ファイルの作成に関する項を参照してください。

アセンブリ・ファイルおよび構成ファイルは、プロジェクト内の次の場所に格納されます。

- アセンブリ・ファイル: <Project-Name>/META-INF/spring/*.xml

- 構成ファイル: <Project-Name>/META-INF/wlevs/*.xml

構成を変更するには、アプリケーションのアセンブリ・ファイルを編集するか、コンポーネントの構成ファイルを編集します。ファイル内では任意の値を変更できますが、アセンブリ・ファイルIDの値と構成ファイル名の値の整合性を維持するよう注意する必要があります。アセンブリ・ファイル内のIDの値を変更する場合、構成ファイル内の名前の値もこれに一致するよう変更する必要があります(逆も同様)。他の任意の情報は1つのファイルでのみ変更できます。Oracle JDeveloperでは、IDと名前の値のペアを使用してアプリケーション・アセンブリ・ファイルおよびコンポーネント構成ファイル内の情報を同期させています。

次のコンポーネントには、processor.xmlにデフォルト設定される構成ファイルがあります。Oracle CQLパターンはprocessor.xmlファイルに格納する必要がありますが、このリスト内の他のすべてのコンポーネントでは別の名前で構成ファイルを使用できます。

- すべてのアダプタ

- チャネル

- Oracle CQLパターン

- ローカル・キャッシュ・システム

- キャッシュ

- RMIOutbound拡張

Coherenceキャッシュ・システムにはデフォルトのcoherence-cache-ファイルがあります。このファイルの名前は変更できます。

コンポーネント構成ファイルは、Oracle Stream Analyticsアプリケーション・バンドルの一部としてデプロイされます。Oracle Stream Analytics Visualizer、wlevs.Adminユーティリティを使用するか、または適切なJMX Mbeanを操作して、後で実行時にこの構成を更新できます。

2.2 アセンブリ・ファイル構造

spring-wlevs-v12_1_3_0.xsdスキーマ・ファイルでは、EPNアセンブリ・ファイルの構造について説明しています。

このスキーマ・ファイルは、Oracle/Middleware/oep/xsdディレクトリにインストールされます。『Oracle Stream Analyticsスキーマ・リファレンス』のEPNアセンブリ・スキーマに関する項を参照してください。

EPNアセンブリ・ファイルには、サブ要素のシーケンスが含まれるbeansという最上位ルート要素があります。個々のサブ要素には、Oracle Stream Analyticsコンポーネントの構成データが含まれています。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:osgi="http://www.springframework.org/schema/osgi"
xmlns:wlevs="http://www.bea.com/ns/wlevs/spring"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/osgi
http://www.springframework.org/schema/osgi/spring-osgi.xsd
http://www.bea.com/ns/wlevs/spring
http://www.bea.com/ns/wlevs/spring/spring-wlevs-v12_1_3_0.xsd">

<wlevs:event-type-repository>
<wlevs:event-type type-name="HelloWorldEvent">
<wlevs:class>com.bea.wlevs.event.example.helloworld.HelloWorldEvent</wlevs:class>
</wlevs:event-type>
</wlevs:event-type-repository>

<wlevs:adapter id="helloworldAdapter"
class="com.bea.wlevs.adapter.example.helloworld.HelloWorldAdapter" >
<wlevs:instance-property name="message" value="HelloWorld - the current time is:"/>
</wlevs:adapter>

<wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
<wlevs:listener ref="helloworldProcessor"/>
<wlevs:source ref="helloworldAdapter"/>
</wlevs:channel>

<wlevs:processor id="helloworldProcessor" />

<wlevs:channel id="helloworldOutputChannel"
event-type="HelloWorldEvent" advertise="true">
<wlevs:listener>
<bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
</wlevs:listener>
<wlevs:source ref="helloworldProcessor"/>
</wlevs:channel>
</beans>

2.2.1 ネストされたEPNアセンブリ・ファイルのステージ

EPNの親ステージ内に子ステージを定義した場合、子ステージはネストと言われます。親ステージのみが子ステージをリスナーとして指定できます。

次の例は、HelloWorldBeanがhelloworldOutputChannel内にネストされているEPNアセンブリ・ソースを示します。親helloworldOutputChannelのみが、ネストされたBeanをリスナーとして指定できます。

<wlevs:adapter id="helloworldAdapter" class="com.bea.wlevs.adapter.example.helloworld.HelloWorldAdapter" >
<wlevs:instance-property name="message" value="HelloWorld - the current time is:"/>
</wlevs:adapter>

<wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
<wlevs:listener ref="helloworldProcessor"/>
<wlevs:source ref="helloworldAdapter"/>
</wlevs:channel>

<wlevs:processor id="helloworldProcessor" />

<wlevs:channel id="helloworldOutputChannel" event-type="HelloWorldEvent" advertise="true">
<wlevs:listener>
<bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
</wlevs:listener>
<wlevs:source ref="helloworldProcessor"/>
</wlevs:channel>

かわりに、例2-1に示すように、すべてのステージがネストされるようにこのEPNを定義できます。helloworldAdapterは最も外側の親ステージであり、EPNの他のステージにアクセスできる単一ステージです。

例2-1 すべてのステージがネストされたEPNアセンブリ・ファイル

<wlevs:adapter id="helloworldAdapter" class="com.bea.wlevs.adapter.example.helloworld.HelloWorldAdapter" >
<wlevs:instance-property name="message"
value="HelloWorld - the current time is:"/>
<wlevs:listener>
<wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
<wlevs:listener>
<wlevs:processor id="helloworldProcessor">
<wlevs:listener>
<wlevs:channel id="helloworldOutputChannel"
event-type="HelloWorldEvent">
<wlevs:listener>
<bean
class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
</wlevs:listener>
</wlevs:channel>
</wlevs:listener>
</wlevs:processor>
</wlevs:listener>
</wlevs:channel>
</wlevs:listener>
</wlevs:adapter>

2.2.2 EPNアセンブリ・ファイル内の外部ステージ

別のOracle Stream Analyticsアプリケーション内にあるステージを参照できます。別のアプリケーションのステージは、外部ステージと見なされます。同じアプリケーションのソースおよびターゲット・ステージを定義する場合、idでこれを実行します。

注:

Oracle CQLプロセッサ・ステージを外部ステージのチャネルに接続することはできません。

別のアプリケーションで定義したステージを参照するには、次の構文を使用します。

FOREIGN-APPLICATION-NAME:FOREIGN-STAGE-ID

ここでは、FOREIGN-APPLICATION-NAMEは、外部ステージを定義したアプリケーションの名前であり、FOREIGN-STAGE-IDは、外部ステージのid属性です。

次の例は、アプリケーションapplication2で定義した外部ステージHelloWorldBeanSourceをapplication1が参照する方法を示します。

<wlevs:stream id="helloworldInstream" >
<wlevs:listener ref="helloworldProcessor"/>
<wlevs:source ref="application2:HelloWorldBeanSource"/>
</wlevs:stream>

<wlevs:event-bean id="HelloWorldBeanSource"
class="com.bea.wlevs.example.helloworld.HelloWorldBeanSource"
advertise="true"/>

次の各ステージは外部ステージにはできません。

- キャッシュ

外部ステージを伴うOracle Stream Analyticsアプリケーションを作成する場合、アプリケーションのアセンブリ、デプロイおよび再デプロイのときに外部ステージの依存関係を考慮する必要があります。詳細は、外部ステージの参照を参照してください。

2.3 コンポーネント構成ファイル構造

wlevs_application_config.xsdスキーマ・ファイルでは、コンポーネント構成ファイルの構造について説明しています。

Oracle Stream Analyticsをインストールすると、このようなXSDファイルは、ディレクトリOracle/Middleware/oep/xsdに格納されます。

このXSDスキーマでは、次のスキーマがインポートされます。

- wlevs_base_config.xsd: アプリケーション構成ファイルとサーバー構成ファイルの間で共有される共通要素を定義します。

- wlevs_eventstore_config.xsd: イベント・ストア固有の要素を定義します。

- wlevs_diagnostic_config.xsd: 診断要素を定義します。

『Oracle Stream Analyticsスキーマ・リファレンス』のスキーマ・コンポーネント構成に関する項を参照してください。

アプリケーション構成ファイルの構造は次のとおりです。configという最上位ルート要素に、サブ要素のシーケンスが含まれています。個々のサブ要素には、Oracle Stream Analyticsコンポーネント(Oracle CQLプロセッサ、チャネルまたはアダプタ)の構成データが含まれています。次に例を示します。

<?xml version="1.0" encoding="UTF-8"?>
<n1:config xmlns:n1="http://www.bea.com/ns/wlevs/config/application"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<processor>
<name>helloworldProcessor</name>
<rules>
<query id="helloworldRule">
<![CDATA[ select * from helloworldInputChannel [Now] >
</query>
</rules>
</processor>
<channel>
<name>helloworldInputChannel</name>
<max-size>10000</max-size>
<max-threads>2</max-threads>
</channel>
<channel>
<name>helloworldOutputChannel</name>
<max-size>10000</max-size>
<max-threads>2</max-threads>
</channel>
</n1:config>

2.4 コンポーネントおよびサーバー構成

ConfigurationPropertyPlaceholderConfigurerクラスを使用し、シンボリック・プレースホルダを使用してコンポーネント構成ファイルおよびサーバー構成ファイルの両方で既存の構成ファイル・プロパティを参照します。

そうすると、複数の場所で同じ値をハードコードするのではなく、1つの場所に値を定義して、その1つの定義を参照できます。

これは、Oracle Stream Analyticsアプリケーション用のアセンブリ・ファイル内のファクトリ名などのJava Message Service (JMS)情報をハードコードせずにJMSを構成する場合などに行うことができます。

com.bea.wlevs.spring.support.ConfigurationPropertyPlaceholderConfigurerクラスを使用して、JMSアダプタを作成し、実際のファクトリ名、ユーザー名およびパスワード値が含まれる別のファイルにサーバー接続のファクトリ名、ユーザー名、パスワードおよび場所のプレースホルダを提供します。ConfigurationPropertyPlaceholderConfigurerクラスは、Springフレームワークの上に実装されます。

サーバー構成ファイルは、Oracle Stream Analyticsサーバーの管理者によって使用されます。このファイルは、1つのドメインに固有の構成情報を含み、/Oracle/Middleware/my_oep/user_projects/domains/<domain_name>/<server_name>/config/にあります。

既存の構成ファイル・プロパティの参照を使用するには、次に示すように、プロジェクトのアセンブリ・ファイルにConfigurationPropertyPlaceholderConfigurer Beanを挿入します。

<bean class="com.bea.wlevs.spring.support.ConfigurationPropertyPlaceholderConfigurer"/>

詳細は、Oracle Stream Analytics Java APIリファレンスのcom.bea.wlevs.spring.support.ConfigurationPropertyPlaceholderConfigurerクラスを参照してください。

2.5 リソース・アクセス構成

Oracle Stream Analyticsアプリケーションは、低待機時間、イベントドリブンかつ高性能駆動型のアプリケーションであるため、軽量なコンテナ上で実行し、POJOベースのプログラミング・モデルで開発されています。

POJO (Plain Old Java Object)プログラミングでは、ビジネス・ロジックはPOJO形式で実装され、必要とするサービスが注入されます。これは一般に、依存関係インジェクションと呼ばれます。インジェクトされたサービスは、構成管理などのOracle Stream Analyticsサービスで提供されるものから、Oracle Kodoなどの他のOracle製品で提供されるサービスやサードパーティ製のサービスまで多岐に渡ります。

Oracle Stream Analytics、標準のJava注釈およびデプロイメントXMLを使用して、リソース(データ・ソースや永続性マネージャなど)をOracle Stream Analyticsアプリケーション・コンポーネントにインジェクトするように、Oracle Stream Analytics Springコンテナを構成できます。

一般的に、コンポーネント初期化中に、Springコンテナでリソースがインジェクトされます。しかし、これによって、ランタイム時にリソースがインジェクトおよび再インジェクトされます。また、ランタイム時に、JNDIルックアップがサポートされます。

Oracle Stream Analyticsでは、次のタイプのリソース・アクセスがサポートされます。

- リソース・アクセス注釈

- 静的リソース・インジェクション

- 動的リソース・インジェクション

- JNDIによる動的リソース参照

- リソース名解決

次の項では、例2-2に示す例のリソースを考慮します。これは、Oracle Stream Analyticsサーバー・ファイルに指定するStockDSと呼ばれるデータ・ソース・リソースです。

例2-2 サンプル・リソース: データ・リソースStockDS

<config ...>
<data-source>
<name>StockDs</name>
...
<driver-params>
<url>jdbc:derby:</url>
...
<driver-params>
</data-source>
...
</config>

2.5.1 リソース・アクセス注釈

javax.annotation.Resource (@Resource)注釈では、設計時にリソース・アクセス、およびその対応するデプロイメントXMLを構成し、デプロイ時にこの構成をオーバーライドします。

2.5.2 静的リソース・インジェクション

静的リソース・インジェクションは、コンポーネント・ライフサイクルの初期化フェーズ中にリソースのインジェクションを参照します。一度インジェクトされると、コンポーネントがアクティブまたは実行中の間、リソースは固定または静的になります。

次を使用して、静的リソース・インジェクションを構成できます。

- 静的リソース名

- 動的リソース名

2.5.2.1 静的リソース名

静的リソース名を使用して静的リソース・インジェクションを構成する場合、@Resource注釈またはOracle Stream AnalyticsアセンブリXMLファイルに使用されるリソース名は、定義されたリソース名と完全一致する必要があります。リソース名は静的であるため、再コンパイルしないと変更できません。

設計時に静的リソース名を使用して静的リソース・インジェクションを構成するには、次の例に示すように、標準のjavax.annotation.Resource注釈を使用します。

設計時の構成をデプロイ時にオーバーライドするには、Oracle Stream Analyticsアセンブリ・ファイルXMLを使用します。

次の例では、リソース名StockDsは、Oracle Stream Analyticsサーバー・ファイルのデータ・ソース名と正確に一致します。

< wlevs:event-bean id="simpleBean" class="...SimpleBean"/>
<wlevs:resource property="dataSource" name="StockDs"/>
</wlevs:event-bean>

EventBeanセット・メソッド名がリソース名と一致する場合、@Resource注釈name属性は必要ではありません。また、この場合、wlevs:resource要素name属性は必要ではありません。

import javax.annotation.Resource;

public class SimpleBean implements EventBean {
...
@Resource ()
public void setStockDs (DataSource dataSource){
this.dataSource = dataSource;
}
}

< wlevs:event-bean id="simpleBean" class="...SimpleBean"/>
<wlevs:resource property="dataSource"/>
</wlevs:event-bean>

例2-3 静的リソース名を使用する静的リソース・インジェクション: 注釈

import javax.annotation.Resource;

public class SimpleBean implements EventBean {
...
@Resource (name="StockDs")
public void setDataSource (DataSource dataSource){
this.dataSource = dataSource;
}
}

2.5.2.2 動的リソース名

動的リソース名は、アプリケーションの動的または外部構成の一部として指定されます。動的リソース名を使用することによって、デプロイヤまたは管理者は、アプリケーション開発者がアプリケーション・コードまたはSpringアプリケーション・コンテキストを変更する必要なくリソース名を変更できます。

アダプタまたはPOJOなどのコンポーネントに動的リソース名を追加するには、まず、リソース名を含むコンポーネントのためにカスタム構成を指定する必要があります。

<simple-bean>
<name>SimpleBean</name>
<trade-datasource>StockDs</trade-datasource>
</simple-bean>

設計時に動的リソース名を使用して静的リソース・インジェクションを構成するには、標準のjavax.annotation.Resource注釈を使用します。

設計時の構成をデプロイ時にオーバーライドするには、Oracle Stream Analyticsアセンブリ・ファイルXMLを使用します。

import javax.annotation.Resource;

public class SimpleBean implements EventBean {
...
@Resource (name="trade-datasource")
public void setDataSource (DataSource dataSource){
this.dataSource = dataSource;
}
}

< wlevs:event-bean id="simpleBean" class="...SimpleBean"/>
<wlevs:resource property="dataSource" name="trade-datasource"/>
</wlevs:event-bean>

2.5.3 動的リソース・インジェクション

動的リソース・インジェクションは、Springコンテナ・メソッド・インジェクションを使用して変更した動的構成に対して、コンポーネントがアクティブである間、動的リソースのインジェクションを参照します。

設計時に動的リソース・インジェクションを構成するには、例2-4に示すように、標準のjavax.annotation.Resource注釈を使用します。

リソース名trade-datasourceが参照するリソースの新しいインスタンスを取得する必要がある場合は、ランタイム時にコンポーネントによって、getDataSourceメソッドが呼び出されます。

一般的に、動的構成の変更が処理されている場合、@Prepareまたは@Activateメソッド中に、コンポーネントによって、getDataSourceメソッドが呼び出されます。

他の方法では、データ・ソースを使用する前に必ずgetDataSourceが呼び出されます。つまり、アプリケーション・コードでは参照をコンポーネントのフィールドとしてデータ・ソースに格納されません。

例2-4 動的リソース・インジェクション: 注釈

import javax.annotations.Resource;

public class SimpleBean implements EventBean {
...
@Resource ("trade-datasource")
public abstract DataSource getDataSource ();
...
}

2.5.4 JNDIによる動的リソース参照

Oracle Stream Analyticsでは、リソースを動的に参照するためにJNDIの使用がサポートされます。

import javax.naming.InitialContext;

public class SimpleBean implements EventBean {
...
public abstract void getDataSource () throws Exception {
InitialContext initialContext= new InitialContext ();
return initialContext.lookup ("StockDs");
}
}

JNDI名StockDsは、Oracle Stream Analyticsサーバー・ファイルのデータ・ソース名と正確に一致する必要があります。

注:

JNDIを使用するには、Oracle Stream Analyticsサーバーの起動時にセキュリティを無効にする必要があります。この理由から、JNDIの使用はお薦めしません。

2.5.5 リソース名解決

Oracle Stream Analyticsサーバーでは、表2-1にリストされたネーミング・スコープを調べて、リソース名が解決されます。

表2-1 リソース名解決

ネーミング・スコープ

目次

解決動作

コンポーネント

コンポーネントのカスタム構成のプロパティ名

マッピング

アプリケーション

アプリケーション構成ファイルの構成要素名

照合

サーバー

サーバー構成ファイルの構成要素名

マッチング

JNDI

サーバーのJNDIレジストリに登録された名前

マッチング

各ネーミング・スコープには一意の名前のセットが含まれます。名前解決動作は、ネーミング・スコープ固有の動作です。一部のネーミング・スコープでは、簡単な一致によって名前を解決します。他のスコープでは、新しい名前を参照するために使用する名前をマップすることで名前を解決します。一度名前がマップされると、参照は現在のスコープで再帰的に続行します。

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

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

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

- イベントの動作

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

- 設計制約

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

- プロパティ

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

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

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

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

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

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

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

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で指定される範囲内の数値

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

- テスト1-2-3

データベース表の制約

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

イベント・タイプでデータベース表からデータを受信する場合、タイプに構成されたプロパティごとにデータベースの特定の列からデータを受信します。イベント・タイプを構成する場合、表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>

手順

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

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

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

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

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

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

次のXML節では、price、fromRateおよび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.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クラスには、name、ageおよび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からサービスを取得できます。

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

- Spring-DM @ServiceReference注釈

- Oracle Stream Analytics @Service注釈

詳細は、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ヘッダーにパッケージ名を追加します。

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

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

- イベント・タイプのデータ構造の選択
外部ステージの参照

- Oracle Stream Analytics Java APIリファレンス

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>

4 アダプタ

アダプタは、EPNの入出力データを管理します。Oracle Stream Analyticsには、CSV、RMIおよびHTTPなどの各種タイプのデータを処理するために様々な種類のインバウンド・アダプタとアウトバウンド・アダプタが用意されています。すべてのアダプタには、OSGi登録アダプタ・ファクトリ・サービスに対する参照であり、アダプタが処理するデータのタイプを定義するproviderプロパティがあります。

インバウンド・アダプタは、EPNに入るデータ・ストリームからイベント・データを受信し、データをイベント・タイプに応じてイベントに割り当て、データをEPN内の次のステージに送信します。アウトバウンド・アダプタは、EPNによって処理されたイベントを受信し、イベントを出力フォームに変換し、変換したデータを別のEPN、非EPNアプリケーション、CSVファイルまたはWebページなどの出力データ・ソースに送信します。

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

- アダプタの作成

- クラスタ配分サービス

- パスワードの暗号化

- JAXBサポート

- CSVアダプタ

- EDNアダプタ

- ファイル・アダプタ

- HTTPパブリッシュ/サブスクライブ・アダプタ

- HTTPパブリッシュ/サブスクライブ・アダプタのカスタム・コンバータBean

- JMSアダプタ

- JMSカスタム・メッセージ・コンバータBean

- Oracle Business Rulesアダプタ

- RESTアダプタ

- RMIアダプタ

高可用性アダプタの詳細は、高可用性アプリケーションを参照してください。

csvgenアダプタとともにロード・ジェネレータを使用してデータ・フィードをシミュレートしてアプリケーションをテストする方法の詳細は、テスト1-2-3を参照してください。

4.1 アダプタの作成

ほとんどのアダプタを作成する上で最適な方法は、Oracle JDeveloperを使用する方法です。Oracle JDeveloperコンポーネント・ウィンドウには、インバウンド・アダプタおよびアウトバウンド・アダプタとしてCSV、EDN、RMI、HTTPおよびJMSが用意されています。

他のアダプタの場合、構成ファイルを直接編集します。この章の各アダプタの項では、設定を確認できるようにアセンブリと構成ファイルの構成の例を示します。

アダプタを作成する前に、Oracle JDeveloperを使用して、アダプタに割り当てるイベント・タイプを作成してください。イベント・タイプの作成の詳細は、『Oracle Stream Analyticsイベント処理スタート・ガイド』のイベント・タイプの作成および登録に関する項を参照してください。

この章では、様々なタイプのアダプタに関するアセンブリおよび構成ファイルの設定について説明します。アダプタ設定の詳細は、『Oracle Stream Analyticsスキーマ・リファレンス』のアダプタに関する項を参照してください。アダプタ・スキーマは、Oracle Stream AnalyticsのインストールのOracle/Middleware/my_oep/oep/wlevs_application_config.xsdディレクトリも参照してください。

4.2 クラスタ配分サービス

クラスタ配分機能には、クラスタ内のすべてのサーバーに着信イベントを配分するために様々なOracle Stream Analyticsアダプタ・タイプ用のメカニズムが採用されています。

イベントを配分するために個別アダプタまたはイベントBeanインスタンスを構成でき、この場合、このアダプタによって処理されるすべての入力イベントはクラスタ内のすべてのサーバーに送信(配分)されます。

配分アダプタにより、すべての入力イベントがクラスタ内のすべてのサーバーに確実に送信(配分)されます。入力アダプタを配分アダプタに変換するには、distributeInput要素を追加し、次のように、これをtrueに設定します。distributionThreadsCountプロパティはオプションで、1にデフォルト設定されます。

<wlevs:adapter id="myLoadgenAdapter" provider="loadgen">
<wlevs:instance-property name="distributeToClusterGroup" value="true"/>
<wlevs:instance-property name="distributionThreadsCount" value="1"/>
</wlevs:adapter>

Oracle Stream Analyticsは、loadgen、CSVインバウンド・アダプタおよびJMSインバウンド(キュー)アダプタ用のクラスタ配分サービスをサポートしています。Oracle Stream Analyticsは、CSVアウトバウンド・アダプタ、JMSインバウンド(トピック)アダプタ、JMSアウトバウンド・アダプタおよびHTTPパブリッシュ/サブスクライブ・アダプタ用のクラスタ配分サービスはサポートしていません。入力配分に対してトピック宛先を構成するとエラーになります。トピック構成によって警告ログ・メッセージが生成され、トピック構成は無視されます。

前述のアダプタ・タイプ以外にも、次の例に示すように、BeanのプロバイダをclusterGroupDistributorとして指定することにより、受信したすべてのイベントをすべてのクラスタ・メンバーに配分するためのイベントBeanを構成することもできます。

<wlevs:event-bean id="distributor-bean" provider="clusterGroupDistributor">
<wlevs:instance-property name="distributionThreadsCount" value="1"/>
... other event bean properties ...
</wlevs:event-bean>

現在、Oracle JDeveloperには、クラスタ配分サービス用のコンポーネントは用意されていません。ただし、Oracle Stream Analyticsアプリケーション用のアセンブリ・ファイルおよび構成ファイルにエントリを追加することにより、クラスタ配分サービスを作成できます。

4.3 パスワードの暗号化

一部のアダプタには、ユーザー名およびパスワードの子要素があります。Oracle Stream Analyticsには、パスワードが含まれるファイルを暗号化できるようencryptMSAConfigコマンドが用意されています。詳細は、Oracle Stream Analyticsの管理のencryptMSAConfigコマンドライン・ユーティリティに関する項を参照してください。

4.4 JAXBサポート

Oracle Event Processingには、アダプタおよびイベントBeanでJava Architecture for XML Binding (JAXB)マッピング機能を使用してXMLオブジェクトとJavaオブジェクト間でイベント・データをマーシャリングおよびアンマーシャリングするための簡易インタフェースが用意されています。

JAXBインタフェースは、JAXB 2.2仕様およびEclipseLink Moxyプロバイダ拡張機能をサポートしています。

マッピング操作は次の方法で構成できます。

- 一連の注釈付きJavaクラスを出力するために、XMLスキーマからJavaオブジェクトにマップします。

- JAXB注釈を使用して、1つのJavaオブジェクト・セットから別のJavaオブジェクト・セットまたはXMLにマップします。

- 既存のXMLスキーマから既存の事前定義済のJavaオブジェクト表現にマップします。このアプローチでは、EclipseLink Moxy拡張機能を使用し、マッピング詳細が含まれる外部のmetadataファイルを必要とします。metadataファイルは、アプリケーション構成によって参照されます。

4.4.1 EclipseLink Moxy

EclipseLink Moxyには、注釈を指定せずにXMLスキーマまたはJavaクラスを変更しないで既存のXMLスキーマと事前定義済のJavaクラス間でマップできる拡張機能が用意されています。マッピング情報は、XPath構文を使用して外部メタデータ・ファイルで指定します。

柔軟性の高いEclipseLink Moxy拡張機能を使用すると、複雑な操作を実行できます。たとえば、複雑なXMLデータのサブセットをより簡単なイベント表現にマップできます。また、深くネストしたXMLドキュメントをフラットなJava Beanイベント形式にフラット化し、Oracle CQLによる処理も可能にします。

EclipseLink Moxyの外部のmetadataはXMLで指定します。http://www.eclipse.org/eclipselink/xsds/eclipselink_oxm_2_2.xsdにあるスキーマにアクセスしてください。

4.4.2 API

JAXB機能を必要とするアダプタまたはイベントBeanは、com.oracle.cep.mappers.api.Mapperインタフェースを実装するBeanのインジェクションによってこの機能を取得します。Mapperインタフェースは、次のようになります。

public interface Mapper {
Marshaller createMarshaller() throws MapperException;
Unmarshaller createUnmarshaller() throws MapperException;
}

アダプタまたは他のEPNコンポーネント・コードでは、インジェクトされたBeanを使用してマーシャリング・オブジェクトおよびアンマーシャリング・オブジェクトを作成します。次に示すcom.oracle.cep.mappers.api.Marshallerおよびcom.oracle.cep.mappers.api.Unmarshaller インタフェースは、ほとんどのアプリケーションに対して機能します。

public interface Marshaller {
void marshal(Object object, javax.xml.transform.Result result)
throws MapperException;
}

public interface Unmarshaller {
Object unmarshal(javax.xml.transform.Source source)
throws MapperException;
}

一部のアプリケーションでは、ターゲット・クラスを引数として使用するアンマーシャリング・メソッドなど、マーシャリングおよびアンマーシャリング用として特別なメソッド・シグネチャが必要な場合があります。このような場合は、かわりにcom.oracle.cep.mappers.jaxb.JAXBMarshallerImpl およびcom.oracle.cep.mappers.jaxb.JAXBUnmarshallerImplインタフェースを使用します。これらのインタフェースには、javax.xml.bind.Marshallerおよびjavax.xml.bind.Unmarshallerインタフェースによってサポートされる完全セットのマーシャリング・メソッドおよびアンマーシャリング・メソッドに対応するメソッドが用意されています。

アセンブリ・ファイル

次のアセンブリ・ファイル・エントリでは、プロパティを使用してマッパーBeanをコールし、イベント・タイプおよびメタデータ・ファイルを指定しています。

<bean id="mapperBean" class="com.oracle.cep.mappers.jaxb.JAXBMapperImpl" >
<property name="eventTypeName" value="CallCenterActivity" />
<property name="metadata" value="external_metadata_case1.xml" />
</bean>

ファクトリをコールしてマッパーBeanを作成するには、Bean要素に対して次を指定します。

<bean id="mapperBean" class="com.oracle.cep.mappers.jaxb.JAXBMapperFactory"
factorymethod="create"/>

構成ファイル

次の構成ファイル・エントリは、マッパーBeanに対してプロパティを指定します。

<jaxb-mapper>
<name>mapperBean</name>
<event-type-name>CallCenterActivity</event-type-name>
<metadata>external_metadata_case1.xml</metadata>
</jaxb-mapper>

プロパティ

マッパーBeanは、プロパティをサポートしています。metadataMapを除くすべてのプロパティは、アセンブリ・ファイルのプロパティまたは構成ファイルの要素として構成できます。

表4-1 マッパーBeanのプロパティおよび要素

アセンブリ・ファイルのプロパティ名

構成ファイルの要素名

説明

eventTypeName

event-type-name

アプリケーションによってイベント・タイプ・リポジトリに登録されているイベント・タイプの名前。イベント・タイプはJavaクラスに対応しています。このクラスのパッケージ名は、マッパーBeanによって表されるJAXBContextを初期化する際にコンテキスト・パスとして使用されます。

この構成では、マッパーによって表されるJAXBContextのコンテキスト・パスの作成で使用されるeventTypeNameまたはcontextPathを指定する必要があります。これらのパッケージは、アプリケーションのclasspath上に存在し、スキーマによって生成されたクラス、JAXBによって注釈が付けられたクラス、またはMoxy外部メタデータによって参照されたクラスを含む必要があります。これらのクラスは、マーシャリング操作およびアンマーシャリング操作用のJavaオブジェクト・グラフとして使用されます。

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

contextPath

context-path

Javaパッケージ名のコロン区切りリスト。マッパーBeanによって表されるJAXBContextを初期化するために指定したコンテキスト・パス。

この構成では、マッパーによって表されるJAXBContextのコンテキスト・パスの作成で使用されるeventTypeNameまたはcontextPathを指定する必要があります。これらのパッケージは、アプリケーションのclasspath上に存在し、スキーマによって生成されたクラス、JAXBによって注釈が付けられたクラス、またはMoxy外部メタデータによって参照されたクラスを含む必要があります。これらのクラスは、マーシャリング操作およびアンマーシャリング操作用のJavaオブジェクト・グラフとして使用されます。

validate

validate

falseにデフォルト設定されるBoolean値。trueの場合、schemaを指定する必要があります。マーシャリングおよびアンマーシャリング中にスキーマ検証が行われます。

schema

schema

検証に使用されるXMLスキーマ・ファイルのファイル名。META-INF/wlevs/mappers/jaxbディレクトリ内でアプリケーションを使用してスキーマ・ファイルをパッケージ化します。

metadata

metadata

マッピングのカスタマイズ用のEclipseLink Moxy外部メタデータが含まれるファイルの名前。META-INF/wlevs/mappers/jaxbディレクトリ内でアプリケーションを使用してファイルをパッケージ化します。

metadataMap

該当なし

contextPathの各コンポーネントに対応する1つのエントリが含まれるSpringの<map>要素。各エントリについて、キーはcontextPathのパッケージ名であり、対応する値は、このパッケージに対するEclipseLink Moxyの外部metadataが含まれるファイルの名前です。

アプリケーションでEclipseLink Moxy固有の外部metadataが使用される場合、metadataの場所はmetadataプロパティまたはmetadataMapプロパティによって指定されます。contextPath上に複数のパッケージがある場合、metadataMapプロパティが必要です。コンポーネント構成ファイルでのmetadataMapプロパティの指定はサポートされていません。

4.5 CSVアダプタ

CSVアダプタは、カンマで区切られたインバウンド・データおよびアウトバウンド・データを処理します。EPNに入力するためにカンマ区切りの値形式でデータを受信するにはCSVInboundアダプタを使用し、EPNから出力するカンマ区切りの値形式でデータを送信するにはCSVOutboundアダプタを使用します。

Oracle Stream Analyticsインストールで提供されるロード・ジェネレータで、CSVインバウンド・アダプタを使用するOracle Stream Analyticsアプリケーションをテストできます。ロード・ジェネレータにより、サンプル・データが含まれるASCIIファイルが読み取られます。CSVインバウンド・アダプタを使用する必要があるのは、CSVインバウンド・アダプタはロード・ジェネレータによって生成されたデータ・パケットを解読するようコーディングされているためです。ロード・ジェネレータとcsvgenアダプタを参照してください。

注:

java.sql.TimeStampタイプの場合、CSVアダプタは、yyyy-mm-dd'T'hh:mm:ss[.fffffffff]の形式でデータの読取りおよび書込みを行います。たとえば、2012-12-12T12:12:12.120のようになります。

CSVアダプタを作成する上で最適な方法は、Oracle JDeveloperコンポーネント・ウィンドウを使用する方法です。Oracle JDeveloperによって生成された次のアセンブリおよび構成ファイルは、CSVのインバウンド・アダプタおよびアウトバウンド・アダプタの構成を示しています。

アセンブリ・ファイル

CSVインバウンド・アダプタは、StockData.csvファイルから読み取られたデータをTradeEventイベント・タイプのイベントに変換します。

wlevs:listener要素は、TradeEventアクティビティについてCSVインバウンド・アダプタをリスニングするコンポーネントを指定します。この例では、リスナーはAdapterOutputChannelです。AdapterOutputChannelコンポーネントは、StockTradeCSVInboundAdapterをリスニングしてここから取引イベントを受信し、次のステージに送信します。

<wlevs:adapter id="StockTradeCSVInboundAdapter" provider="csv-inbound">
<wlevs:listener ref="AdapterOutputChannel"/>
<wlevs:instance-property name="eventType" value="TradeEvent"/>
<wlevs:instance-property name="sourceUrl"
value="file:/scratch/mpawlan/oep9-19/oep/utils/load-generator/StockData.csv"/>
</wlevs:adapter>

アウトバウンド・アダプタのアセンブリ・ファイル構成は、インバウンド・アダプタと類似していますが、append属性が含まれます。trueに設定すると、Oracle Stream Analyticsにより、既存の出力ファイルにデータが追加されます。falseに設定すると、Oracle Stream Analyticsにより、新規ファイルが作成されるか、または同じ名前の既存ファイルが上書きされます。

<wlevs:adapter id="StockTradeCSVOutboundAdapter" provider="csv-outbound">
<wlevs:instance-property name="eventType" value="TradeEvent"/>
<wlevs:instance-property name="outputFile" value="/scratch/mpawlan/oep9-19/oep/utils/load-generator/StockData.csv"/>
<wlevs:instance-property name="append" value="false"/>
</wlevs:adapter>

outputFile値には絶対パスまたは相対パスを指定できます。相対パスの場合、../filename.csv、../result.csvまたはupload/result.csvを指定できます。相対パスを指定する場合、抽象パスに親ディレクトリが含まれることを確認してください。たとえば、UNIXの場合、カレント・ディレクトリ内のファイルを単純にresult.csvとして指定するのではなく./result.csvとして指定します。

構成ファイル

構成ファイル内のアダプタ要素には、アダプタのname属性とその値が示されます。アダプタ名は、アセンブリ・ファイル内のアダプタのid属性と一致する必要があります。

<csv-adapter>
<name>StockTradeCSVInboundAdapter</name>
<event-interval units="nanoseconds">5</event-interval>
</csv-adapter>

<csv-adapter>
<name>StockTradeCSVOutboundAdapter</name>
</csv-adapter>

4.6 EDNアダプタ

イベント配信ネットワーク(EDN)のインバウンド・アダプタおよびアウトバウンド・アダプタは、JAXBを使用してEPNからOracle SOA Suiteイベント・ネットワークへのインタフェースを実現します。

EDNアダプタには、EDN XMLデータ転送をRAW XML (trueの場合)として表すかJAXBを使用してJavaオブジェクトとして表すかを指定するraw-xml-content構成要素があります。JAXBの場合、アダプタは、一連の適切なスキーマ(xjc)によって生成されたクラスがOracle Stream Analyticsアプリケーション・バンドルのクラス・パスに含まれることを想定します。

EDNアダプタは、イベント・タイプおよびEDLファイルへの参照を使用して構成します。初期化時には、構成されたイベント・タイプと一致するイベント定義QNameが含まれるEDLファイルが検索されます。構成されたイベント・タイプがEDL内で見つかった場合は、対応するQNameについてEDNにサブスクリプションが登録されます。

EDNアダプタとEDLファイルの使用方法の詳細は、『Oracle Stream Analyticsイベント処理スタート・ガイド』のEDNアダプタを使用したアプリケーション作成に関する項を参照してください。

4.6.1 使用方法

EDNInboundアダプタを使用して、Oracle SOA Suiteイベント・ネットワークからの着信データを受信します。EDN入力アダプタは、指定されたEDNイベント・タイプをサブスクライブし、着信EDNイベントをOracle Stream Analyticsイベント・タイプに変換し、Oracle Stream Analyticsアプリケーションが処理できるようにします。

EDNOutboundアダプタを使用して、Oracle SOA Suiteイベント・ネットワークにアウトバウンド・データを送信します。EDN出力アダプタは、Oracle Stream Analyticsイベントを対応するEDNイベントに変換し、これらをEDNにパブリッシュします。パブリッシュされたイベントは、Oracle Stream Analyticsアプリケーションで生成された新規イベントである場合や、EDN入力アダプタによって受信され、Oracle Stream Analyticsアプリケーションによって処理され、EDN出力アダプタに送信されたEDNイベントである場合があります。

4.6.2 EDNアダプタの作成

EDNアダプタを作成する上で最適な方法は、Oracle JDeveloperコンポーネント・ウィンドウを使用する方法です。Oracle JDeveloperによって生成された次のアセンブリおよび構成ファイルは、EDNのインバウンド・アダプタおよびアウトバウンド・アダプタの構成を示しています。

EDNアダプタの詳細は、『Oracle Stream Analyticsスキーマ・リファレンス』のedn-adapterに関する項を参照してください。

アセンブリ・ファイル

次のアセンブリ・ファイル・エントリは、『Oracle Stream Analyticsイベント処理スタート・ガイド』の不正検出アプリケーションに関する項の不正検出ウォークスルーで作成されたインバウンドおよびアウトバウンドのEDNアダプタの要素および属性設定を示します。

- EDN入力アダプタは、EDN入力チャネルをリスニングしてFraudCheckRequestタイプのすべてのイベントを検索します。

- EDN出力アダプタは、FraudCheckRequestタイプのイベントをEPN内の次のステージに送信します。

<wlevs:adapter id="edn-inbound-adapter" provider="edn-inbound">
<wlevs:listener ref="ednInputChannel"/>
<wlevs:instance-property name="eventType" value="FraudCheckRequest"/>
</wlevs:adapter>

<wlevs:adapter id="edn-outbound-adapter" provider="edn-outbound">
<wlevs:instance-property name="eventType" value="FraudCheckResponse"/>
</wlevs:adapter>

構成ファイル

次の構成ファイル・エントリは、Oracle Stream Analyticsイベント処理スタート・ガイドの不正検出アプリケーションに関する項の不正検出ウォークスルーで作成されたEDNインバウンド・アダプタおよびアウトバウンドEDNアダプタの構成設定を示します。

注:
バンドルされたJARファイルの固定パスにEDLファイルおよびスキーマ(xsd)ファイルを配置する必要があります。

<edn-adapter>
<name>edn-outbound-adapter</name>
<edl-file>FraudCheckEvent.edl</edl-file>
<validate>false</validate>
<raw-xml-content>false</raw-xml-content>
<jndi-provider-url>t3://localhost:7101</jndi-provider-url>
<jndi-factory>weblogic.jndi.WLInitialContextFactory</jndi-factory>
<user>weblogic</user>
<password>welcome1</password>
</edn-adapter>

<edn-adapter>
<name>edn-inbound-adapter</name>
<edl-file>FraudCheckEvent.edl</edl-file>
<schema-file>FraudCheckType.xsd</schema-file>
<validate>false</validate>
<raw-xml-content>false</raw-xml-content>
<jndi-provider-url>t3://localhost:7101</jndi-provider-url>
<jndi-factory>weblogic.jndi.WLInitialContextFactory</jndi-factory>
<user>weblogic</user>
<password>welcome1</password>
</edn-adapter>

4.7 ファイル・アダプタ

ファイル・アダプタは、ファイルからデータを読み取ってEPNに書き込み、このデータをイベントに変換します。

現在、Oracle JDeveloperには、ファイル・アダプタ用のコンポーネントは用意されていません。ただし、Oracle Stream Analyticsアプリケーション用のアセンブリ・ファイルおよび構成ファイルにエントリを追加することにより、ファイル・アダプタを作成できます。

アセンブリ・ファイル

pathプロパティは、入力ファイルの場所を示します。アダプタは、入力ファイルからデータを読み取る際に、受信データをOrderArrivalEventタイプのイベントに変換します。ファイル・アダプタがファイルの読取りを開始するまでに5000ナノ秒のinitialDelayがあります。ダウンストリームのOrderArrivalチャネルは、OrderArrivalEventタイプのイベントをリスニングします。

<wlevs:adapter id="inputAdapter" provider="file" >
<wlevs:instance-property name="path"
value="@wlevs.domain.home@/inpOrderArrival.txt"/>
<wlevs:instance-property name="eventType" value="OrderArrivalEvent"/>
<wlevs:instance-property name="initialDelay" value="5000"/>
<wlevs:listener ref="OrderArrival"/>
</wlevs:adapter>

構成ファイル

<adapter>
<name>inputAdapter</name>
</adapter>

4.8 HTTPパブリッシュ/サブスクライブ・アダプタ

HTTPパブリッシャ・アダプタを使用して、JavaScript Object Notation (JSON)イベント・データをEPNからWebベースのユーザー・インタフェースに送信します。HTTPサブスクライバ・アダプタを使用して、EPNに入るJavaScript Object Notation (JSON)イベント・データを受け入れます。JSONイベント・データは、ユーザー・アクションによってイベントを生成するHTTPサーバーから送信されます。

Oracle Stream Analytics内のHTTPパブリッシュ/サブスクライブ・サーバーは、cometdプロジェクトで提案されているBayeuxプロトコルに基づいています。Bayeuxプロトコルには、クライアントとサーバーがHTTPを介して非同期メッセージで通信するための規約が定義されています。

リモートまたはローカルHTTPパブリッシャ・アダプタおよびリモートHTTPサブスクライバ・アダプタを作成できます。HTTPアダプタがローカルとリモートのどちらであるかは、必要な<server-url>子要素に指定するローカルまたはリモートURLによって決定されます。

HTTPパブリッシュ/サブスクライブ・アダプタを作成する上で最適な方法は、Oracle JDeveloperを使用する方法です。

注:

HTTPパブリッシュ/サブスクライブ・アダプタで使用されるイベント・タイプのプロパティ・タイプとして、バイト配列はサポートされていません。

アセンブリ・ファイル

<wlevs:adapter id="http-pub-adapter" provider="httppub"/>

<wlevs:adapter id="http-sub-adapter" provider="httpsub" />

構成ファイル

すべてのローカル・アダプタおよびリモート・アダプタについて、サーバーのURLをserver-urlプロパティに指定します。サーバーには、Oracle Stream Analyticsサーバー、WebLogic Serverインスタンス、または任意のサードパーティのHTTPパブリッシュ/サブスクライブ・サーバーを指定できます。

パブリッシュ対象のすべてのローカル・アダプタについて、server-context-path要素を追加し、現在のOracle Stream AnalyticsアプリケーションをホストするOracle Stream Analyticsインスタンスに関連付けられているローカルHTTPパブリッシュ/サブスクライブ・サーバーへのパスを指定します。

デフォルトでは、各Oracle Stream Analyticsサーバーは、パス/pubsubを持つHTTPパブリッシュ/サブスクライブ・サーバーを使用して構成されます。新規ローカルHTTPパブリッシュ/サブスクライブ・サーバーを作成したか、デフォルトの構成を変更した場合は、サーバー・ファイル内のサーバーの場所を指定します。ファイル内で、サーバーの場所とともにhttp-pubsub要素のpath値を指定します。Oracle Stream Analyticsインストール内のサーバー・ファイルは、/Oracle/Middleware/my_oep/examples/domains/<my_domain>/defaultserverにあります。

channel子要素は、アダプタがパブリッシュするチャネルまたはサブスクライブするチャネルを指定します。

<http-pub-sub-adapter>
<name>http-pub-adapter</name>
<server-url>http://myhost.com:9102/pubsub</server-url>
<channel>/channel2</channel>
<event-type>com.mycompany.httppubsub.PubsubEvent</event-type>
<user>wlevs</user>
<password>wlevs</password>
</http-pub-sub-adapter>

<http-pub-sub-adapter>
<name>http-sub-adapter</name>
<server-url>http://myhost.com:9102/pubsub</server-url>
<channel>/channel2</channel>
<event-type>com.mycompany.httppubsub.PubsubEvent</event-type>
</http-pub-sub-adapter>

4.9 HTTPパブリッシュ/サブスクライブ・アダプタのカスタム・コンバータBean

HTTPパブリッシュ/サブスクライブ・アダプタは、受信したJavaScript Object Notation (JSON)メッセージをイベント・タイプに変換し、再度戻します。JSONのインバウンド・メッセージおよびアウトバウンド・メッセージをイベント・タイプに変換し、再度戻す方法をカスタマイズするには、カスタム・コンバータBeanを作成します。

4.9.1 Bayeuxプロトコル

HTTPパブリッシュ/サブスクライブ(pub-sub)サーバーはcometdプロジェクトで提案されているBayeuxプロトコルに基づいています。Bayeuxプロトコルには、クライアントとサーバーがHTTPを介して非同期メッセージで通信するための規約が定義されています。pub-subサーバーは、Bayeuxプロトコルを理解するすべてのクライアントと通信できます。

次のフレームワークを使用してWebクライアントを開発できます。

- BayeuxプロトコルをサポートするDojo JavaScriptライブラリ。Oracle Stream Analyticsでは、このライブラリは提供されていません。詳細は、http://dojotoolkit.org/を参照してください。

- Bayeuxプロトコルを使用してpub-subサーバーと通信するFlexクライアントの開発を可能にするWebLogic Workshop Flexプラグイン。

HTTP pub-subサーバー・チャネルの保護の詳細は、『Oracle Stream Analyticsの管理』のHTTPパブリッシュ・サブスクライブ・サーバーに関する項を参照してください。

4.9.2 カスタム・コンバータBeanの作成

カスタム・コンバータBeanは、次のインタフェースを実装するJavaクラスです。

- InboundMessageConverterインタフェース: インバウンドJSONメッセージをイベントに変換します。

- OutboundMessageConverterインタフェース: イベントをJSONメッセージに変換します。

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

インバウンドHTTP Pub-Sub JSONメッセージ

インバウンドHTTP pub-sub JSONメッセージ用のカスタム・コンバータBeanは、com.bea.wlevs.adapters.httppubsub.api.InboundMessageConverterインタフェースを実装します。このインタフェースは、convertメソッドのみが設定されています。

public List convert(JSONObject message) throws Exception;

messageパラメータは、JSON形式のインバウンドHTTP pub-subメッセージです。戻り値は、EPN内の次のノードに渡すイベントのListです。

アウトバウンドHTTP Pub-Sub JSONメッセージ

アウトバウンドHTTP pub-subメッセージ用のカスタム・コンバータBeanは、com.bea.wlevs.adapters.httppubsub.api.OutboundMessageConverterインタフェースを実装します。このインタフェースは、convertメソッドのみが設定されています。

public List<JSONObject> convert(Object event) throws Exception;

eventパラメータは、EPN内のソース・ノードから送信されてアウトバウンドHTTP pub-subアダプタによって受信されたイベントです。戻り値は、JSONメッセージのListです。

例

次の例は、InboundMessageConverterインタフェースとOutboundMessageConvertインタフェースの両方を実装するカスタム・コンバータBeanを示しています。このBeanは、インバウンドとアウトバウンドの両方のHTTP pub-subアダプタに対して使用できます。

注:

JavaオブジェクトをJSON形式に変換するためにGSON Javaライブラリを使用できます。詳細は、http://www.json.orgおよびhttp://code.google.com/p/google-gsonを参照してください。

package com.sample.httppubsub;
import com.bea.wlevs.adapters.httppubsub.api.InboundMessageConverter;
import com.bea.wlevs.adapters.httppubsub.api.OutboundMessageConverter;
import com.bea.httppubsub.json.JSONObject;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class TestConverter implements InboundMessageConverter, OutboundMessageConverter {
public List convert(JSONObject message) throws Exception {
List eventCollection = new ArrayList();
PubsubTestEvent event = new PubsubTestEvent();
event.setMessage("From TestConverter: " + message);
eventCollection.add(event);
return eventCollection;
}
public List<JSONObject> convert(Object event) throws Exception {
List<JSONObject> list = new ArrayList<JSONObject>(1);
Map map = new HashMap();
map.put("message", ((PubsubTestEvent) event).getMessage());
list.add(new JSONObject(map));
return list;
}
}

4.10 JMSアダプタ

JMSアダプタを使用して、Oracle Stream AnalyticsのEPNにJava Message Service (JMS)を接続し、JMSメッセージを送受信します。

Oracle Stream Analytics JMSアダプタは、Java EEに準拠する、Javaクライアントを提供するJMSサービス・プロバイダをサポートします。

JMSインバウンド・アダプタが着信JMSメッセージをOracle Stream Analyticsイベントに変換し、JMSアウトバウンド・アダプタがOracle Stream AnalyticsイベントをJMSメッセージに変換します。インバウンド変換をカスタマイズするには、独自のJavaクラスを作成します。『Oracle Stream Analyticsのカスタマイズ』のカスタム・アダプタに関する項を参照してください。

JMSアダプタを作成する上で最適な方法は、Oracle JDeveloperコンポーネント・ウィンドウを使用する方法です。Oracle JDeveloperによって生成された次のアセンブリおよび構成ファイルは、JMSのインバウンド・アダプタおよびアウトバウンド・アダプタの構成を示しています。

注:

アウトバウンドJMSアダプタに関連付けられたMessageConverterオブジェクトで発生する例外によって基礎となるJMSトランザクションがロールバックされることはありません。アウトバウンドJMSアダプタ内のMessageConverterの外部で例外が発生した場合、既存のJMSトランザクションがロールバックされます。

4.10.1 サービス・プロバイダ

Oracle Stream Analyticsは、次のサービス・プロバイダに対してテストされます。

- Oracle T3プロトコルを使用してOracle WebLogic Serverと通信するJava RMIクライアントであるWebLogic T3クライアント

- Oracle WebLogic Server JMSのバージョン10.0、10.3および10.3.1

- Tibco EMS JMSの現在のバージョン

使用するサービス・プロバイダがリストにない場合は、使用しているサービス・プロバイダに連絡し、jms-adapter構成に必要なjndi-provider-urlおよびjndi-factoryの情報を取得することにより、使用しているサービス・プロバイダとともに使用するようOracle Stream Analytics JMSアダプタを構成できます。

4.10.2 インバウンド・アダプタ構成

アセンブリ・ファイル

<wlevs:adapter id="jms-inbound-adapter" provider="jms-inbound" />

構成ファイル

インバウンド・アダプタは、着信JMSメッセージをTradeEventに変換します。JNDIファクトリおよびサービス・プロバイダは、weblogic.jndi.WLInitialContextFactoryおよびt3://localhost:7101です。着信クライアントは、JNDI名がJNDINameであるアダプタを検索します。JMSアダプタは、JMSメッセージをイベントに変換した後、イベントをQueue1のJNDI宛先に送信します。

オプションのconnection-jndi-name要素は、JMS接続ファクトリのJNDI名を提供します。必須のdestination-jndi-name要素は、JMS宛先のJNDI名を提供します。session-transacted要素がfalseである場合、セッションがトランザクション・セッションではないことを示します。

<jms-adapter>
<name>jms-inbound-adapter</name>
<event-type>TradeEvent</event-type>
<jndi-provider-url>t3://localhost:7101</jndi-provider-url>
<jndi-factory>weblogic.jndi.WLInitialContextFactory</jndi-factory>
<connection-jndi-name>JNDIName</connection-jndi-name>
<destination-jndi-name>Queue1</destination-jndi-name>
<session-transacted>false</session-transacted>
</jms-adapter>

4.10.2.1 シングルおよびマルチスレッドのインバウンドJMSアダプタ

デフォルトでは、インバウンドJMSアダプタはシングルスレッドです。インバウンドJMSアダプタがシングルスレッドであると、イベント順序が保証されます。

スケーラビリティを向上させるために、インバウンドJMSアダプタでマルチスレッドを使用してJMS宛先からメッセージを読み取るように構成できます。インバウンドJMSアダプタがマルチスレッドであると、イベント順序は保証されません。複数のスレッドを使用するには、work-manager子要素を使用してワーク・マネージャとともにアダプタを構成します。アダプタのみが使用する専用のワーク・マネージャを指定するか、他のアダプタやJettyなどのいくつかのコンポーネントでワーク・マネージャを共有できます。

4.10.2.2 恒久サブスクリプション用のJMSアダプタの構成

JMSトピックへの恒久サブスクリプション内のクライアントになるように、インバウンドJMSアダプタを構成できます。恒久サブスクリプションでは、アダプタが非アクティブになった場合も、アダプタはパブリッシュされたメッセージを確実に受信します。インバウンド・アダプタがJMSサーバーに接続すると、恒久サブスクリプションが登録されます。それ以降にトピックに送信されるメッセージは、サブスクライバが切断されている間も保持され(期限切れではない場合)、再接続すると配信されます。

恒久サブスクリプションは、JMSメッセージをトピックにパブリッシュしているパブリッシャが永続配信モードを使用していることを前提とします。パブリッシャはOracle Stream AnalyticsのアウトバウンドJMSアダプタである(つまりdelivery-modeの値は、デフォルト値のpersistentである必要がある)ことに注意してください。

アダプタ内の恒久サブスクリプションの作成

1. JMSメッセージ・パブリッシャが永続モードでメッセージを配信していることを確認します。

2. 接続ファクトリのクライアントIDを指定します。Oracle WebLogic Serverで、管理上、コンソールを使用して接続ファクトリにクライアントIDを設定できます。恒久サブスクライバを使用している各アダプタ・インスタンスに専用の接続ファクトリが構成されている必要があります。

3. 次の3つのjms-adapterプロパティを設定します。

- destination-typeをTOPICに設定します。

- durable-subscriptionをtrueに設定します。

- durable-subscription-nameを一意のサブスクリプション識別子に設定します。

4.10.3 アウトバウンド・アダプタ構成

アウトバウンドJMSアダプタは、イベントをJMSマップ・メッセージに変換し、JMSメッセージをJMS宛先に送信します。イベント・タイプが発信JMSメッセージに変換される方法を厳密に指定する独自のJavaクラスを作成することで、この変換をカスタマイズすることもできます。『Oracle Stream Analyticsのカスタマイズ』のカスタム・アダプタに関する項を参照してください。

アセンブリ・ファイル

<wlevs:adapter id="jms-outbound-adapter" provider="jms-outbound"/>

構成ファイル

JMSアウトバウンド・アダプタの構成は、JMSインバウンド・アダプタの構成とほぼ同じです。アウトバウンド・アダプタは、JMS宛先を指定し、JMS宛先にアクセスするためのユーザー名およびパスワードを提供します。このセッションはトランザクション・セッションであり、永続的ではありません。

<jms-adapter>
<name>jms-outbound-adapter</name>
<event-type>TradeEvent</event-type>
<jndi-provider-url>t3://localhost:7101</jndi-provider-url>
<jndi-factory>weblogic.jndi.WLInitialContextFactory</jndi-factory>
<connection-jndi-name>Topic</connection-jndi-name>
<destination-jndi-name>Queue2</destination-jndi-name>
<user>weblogic</user>
<password>welcome1</password>
<session-transacted>true</session-transacted>
<delivery-mode>nonpersistent</delivery-mode>
</jms-adapter>

4.11 JMSカスタム・メッセージ・コンバータBean

JMSメッセージとイベント・タイプ間の変換をカスタマイズするには、インバウンド・コンバータBeanおよびアウトバウンド・コンバータBeanを作成し、これらをOracle Stream Analyticsアプリケーションとともにパッケージ化します。

4.11.1 インタフェースの実装

インバウンド・コンバータBeanおよびアウトバウンド・コンバータBeanは、次の2つのインバウンド・インタフェースおよびアウトバウンド・インタフェースでメソッドを実装します。これらのAPIの詳細は、Oracle Stream Analytics Java APIリファレンスを参照してください。

- インバウンド: com.bea.wlevs.adapters.jms.api.InboundMessageConverter。convertメソッドを実装する必要があります。return値は、ダウンストリームで渡されるイベントのListです。

public List convert(Message message)
throws MessageConverterException, JMSException;

messageパラメータ: 着信JMSメッセージに対応します。

- アウトバウンド: com.bea.wlevs.adapters.jms.api.OutboundMessageConverterインタフェース。convertメソッドを実装する必要があります。return値は、JMSメッセージのListです。

public List<Message> convert(Session session, Object event)
throws MessageConverterException, JMSException;

sessionパラメータ: メッセージの作成に使用されるjavax.jms.Session。

eventパラメータ: EPN内のソース・ステージから送信されてアウトバウンドJMSアダプタによって受信されるイベント。

4.11.2 インバウンドJMSアダプタの実装

次の例では、インバウンドJMSアダプタ用のconvertメソッドを実装する方法を示します。

1. Oracle JDeveloperで、Javaクラスをアプリケーション・プロジェクトに追加します。

2. com.bea.wlevs.adapters.jms.api.InboundMessageConverterインタフェースを実装します。

次の例では、使用可能な実装を示します。

package com.customer;
import com.bea.wlevs.adapters.jms.api.InboundMessageConverter;
import com.bea.wlevs.adapters.jms.api.MessageConverterException;
import com.bea.wlevs.adapters.jms.api.OutboundMessageConverter;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import java.util.ArrayList;
import java.util.List;
public class MessageConverter implements InboundMessageConverter,
OutboundMessageConverter {
public List convert(Message message) throws MessageConverterException, JMSException {
TestEvent event = new TestEvent();
TextMessage textMessage = (TextMessage) message;
event.setString_1(textMessage.getText());
List events = new ArrayList(1);
events.add(event);
return events;
}
public List<Message> convert(Session session, Object inputEvent)
throws MessageConverterException, JMSException {
TestEvent event = (TestEvent) inputEvent;
TextMessage message = session.createTextMessage(
"Text message: " + event.getString_1()
);
List<Message> messages = new ArrayList<Message>();
messages.add(message);
return messages;
}
}

3. アプリケーションEPNアセンブリ・ファイルでコンバータを指定します。

- bean要素を使用してコンバータ・クラスを登録します。

- nameをconverterBeanに設定し、refをbeanのidに設定したwlevs:instance-propertyを追加することで、コンバータ・クラスとJMSアダプタを関連付けます。

次の例では、コンバータ・クラスを登録して関連付ける方法を示します。

...
<bean id="myConverter" class="com.customer.MessageConverter"/>
<wlevs:adapter id="jmsInbound" provider="jms-inbound">
<wlevs:instance-property name="converterBean" ref="myConverter"/>
<wlevs:listener ref="mySink"/>
</wlevs:adapter>

4.11.3 アウトバウンドJMSアダプタの実装

次の例では、アウトバウンドJMSアダプタ用のconvertメソッドを実装する方法を示します。

1. Oracle JDeveloper (または希望するIDE)を使用して、Javaクラスをアプリケーション・プロジェクトに追加します。

2. com.bea.wlevs.adapters.jms.api.OutboundMessageConverterインタフェースを実装します。

次の例では、使用可能な実装を示します。

package com.customer;
import com.bea.wlevs.adapters.jms.api.InboundMessageConverter;
import com.bea.wlevs.adapters.jms.api.MessageConverterException;
import com.bea.wlevs.adapters.jms.api.OutboundMessageConverter;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import java.util.ArrayList;
import java.util.List;
public class MessageConverter implements InboundMessageConverter,
OutboundMessageConverter {
public List convert(Message message) throws MessageConverterException, JMSException {
TestEvent event = new TestEvent();
TextMessage textMessage = (TextMessage) message;
event.setString_1(textMessage.getText());
List events = new ArrayList(1);
events.add(event);
return events;
}
public List<Message> convert(Session session, Object inputEvent)
throws MessageConverterException, JMSException {
TestEvent event = (TestEvent) inputEvent;
TextMessage message = session.createTextMessage(
"Text message: " + event.getString_1()
);
List<Message> messages = new ArrayList<Message>();
messages.add(message);
return messages;
}
}

3. アプリケーションEPNアセンブリ・ファイルでコンバータを指定します。

- bean要素を使用してコンバータ・クラスを登録します。

- nameをconverterBeanに設定し、refをbeanのidに設定したwlevs:instance-propertyを追加することで、コンバータ・クラスとJMSアダプタを関連付けます。

次の例では、コンバータ・クラスを登録して関連付ける方法を示します。

<bean id="myConverter" class="com.customer.MessageConverter"/>
<wlevs:adapter id="jmsOutbound" provider="jms-outbound">
<wlevs:instance-property name="converterBean" ref="myConverter"/>
</wlevs:adapter>

4.12 Oracle Business Rulesアダプタ

Oracle Business Rules (OBR)アダプタは、Oracle Business Rules製品のビジネス・ルール・エンジンをラップするイベントBeanです。OBRアダプタを使用すると、イベントをファクトとしてアサートおよび取消しを行い、ビジネス・ルールをトリガーできます。

イベントを生成し、ビジネス・ロジックをOracle CQLプロセッサのダウンストリームに追加し、イベントを処理するようOBRルールを構成できます。たとえば、ルール・ファイル内でStreamSender.sendInsertEventを起動し、OBRアダプタからデータをイベントとして送信できます。

Oracle JDeveloperでは、アセンブリ・ファイルまたはEPN図に対してドラッグ・アンド・ドロップ・コンポーネントは提供されていませんが、構成ファイルに対してはドラッグ・アンド・ドロップ・コンポーネントが提供されています。

アセンブリ・ファイルにエントリを追加すること、およびOBRアダプタを構成ファイルにドラッグ・アンド・ドロップすることで、OBRアダプタを作成できます。エントリの追加によるOBRアダプタ作成の詳細は、OBRドキュメント(http://www.oracle.com/technetwork/middleware/business-rules/documentation/index.html)を参照してください。

アセンブリ・ファイル

event-type-repository要素は、アプリケーションのイベント・タイプ・リポジトリを指定します。次の例では、リポジトリにはHelloWorldEventという名前の単一のイベント・タイプがあり、リポジトリはHelloWorldEvent.javaクラスによって実装されます。

次のアダプタは、HelloWorldAdapter Javaクラスの値を使用してhelloworldAdapter IDと等しいidを指定します。アダプタはHelloWorldAdapter Javaクラスから作成されます。OBRアダプタ構成には、指定したメッセージ・テキストとともにmessage要素が含まれます。HelloWorldAdapterクラスは、アプリケーションの実行時にmessageを出力します。この例では、HelloWorldAdapterクラスがイベント・ソースです。

チャネルおよびOracle CQLプロセッサの構成の後に、OBRアダプタの宣言である<wlevs:adapter id="OBRAdapter" provider = "obr">が続き、その後ろにdecisionFunctionおよびdictionaryURLプロパティが続きます。dictionaryURLプロパティはルールが含まれるOBRディクショナリ・ファイルへのパスであり、decisionFunctionプロパティは使用するOBR関数です。handler1プロパティは、この情報にアクセスするための他のコンポーネントのハンドルです。

注:

OBRアダプタは、ファクトの自動取消しを処理しません。アップストリーム・プロセッサによってストリームが出力される場合、必要に応じて、またはルールの優先度に応じて最後のルールがトリガーされたら、ルール・ファイル内のファクトを取り消します。

最下部にあるのはHelloWorldBean構成です。HelloWorldBeanは、HelloworldEventおよびHelloWorldAdapterクラスをインスタンス化するJavaクラスです。

<wlevs:event-type-repository>
<wlevs:event-type type-name="HelloWorldEvent">
<wlevs:class>com.bea.wlevs.event.example.helloworld.HelloWorldEvent
</wlevs:class>
</wlevs:event-type>
</wlevs:event-type-repository>
<wlevs:adapter id="helloworldAdapter"
class="com.bea.wlevs.adapter.example.helloworld.HelloWorldAdapter" >
<wlevs:instance-property name="message" value="HelloWorld - The time is:"/>
</wlevs:adapter>

<wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
<wlevs:listener ref="helloworldProcessor"/>
<wlevs:source ref="helloworldAdapter"/>
</wlevs:channel>

<wlevs:processor id="helloworldProcessor" />

<wlevs:channel id="helloworldOutputChannel" event-type="HelloWorldEvent"
advertise="true" max-threads="0" max-size="0" >
<wlevs:listener ref="OBRAdapter"/>
<wlevs:source ref="helloworldProcessor"/>
</wlevs:channel>

<wlevs:adapter id="OBRAdapter" provider = "obr">
<wlevs:instance-property name="decisionFunction" value="handler1" />
<wlevs:instance-property name="dictionaryUrl" value="file:helloworld.rules"/>
<wlevs:listener ref="OutputBean"/>
</wlevs:adapter>

<wlevs:event-bean id="OutputBean"
class="com.bea.wlevs.example.helloworld.HelloWorldBean">
</wlevs:event-bean>

構成ファイル

この構成ファイルは、OBRアダプタから受信したHelloworldEventを処理するために使用される問合せルールおよびOracle CQLプロセッサを宣言します。また、OBRルールにアクセスするためのOBRアダプタのハンドラ(handler1)も提供します。dictionary-url要素は、使用する決定関数およびルールが含まれるOBRディクショナリ・ファイルへのパスを指定します。decision-function要素は、使用するOBR決定関数の名前を指定します。

<processor>
<name>helloworldProcessor</name>
<rules>
<query id="helloworldRule">
<![CDATA[ select * from helloworldInputChannel[range 10 slide 5] ]] >
select * from helloworldInputChannel[now]
</query>
</rules>
</processor>
<obr-adapter>
<name>OBRAdapter</name>
<dictionary-url>file:helloworld.rules</dictionary-url>
<decision-function>handler1</decision-function>
</obr-adapter>

4.13 QuickFixアダプタ

QuickFixアダプタは、Financial Information eXchange (FIX)標準に従ってセキュリティ・トランザクションのリアルタイムな電子交換を処理するためのフル機能のメッセージング・エンジンです。

QuickFixアダプタは、FIXメッセージのリスニング、FIXメッセージのOracle Stream Analyticsイベントへの変換、および次のステージで処理を行うためのイベントの送信を行います。サンプル・アプリケーションは『Oracle Stream Analyticsイベント処理スタート・ガイド』のQuickFixアダプタを使用したサンプル・アプリケーションに関する項を参照してください。

QuickFixアダプタは、基礎となるQuickFIXエンジンが提供する構成データをすべてサポートしています。FIX構成データの詳細は、『QuickFIX/J User Manual』(http://www.quickfixj.org/documentation/)を参照してください。

注:

12cリリースでは、Oracle Stream AnalyticsはQuickFIX動的アクセプタ・セッションをサポートしません。

QuickFixアダプタはSSLをサポートしていません。

4.13.1 サポートされているQuickFixバージョンおよびサポートされていないメッセージ・タイプ

QuickFIXエンジンは、広範囲なメッセージ・タイプをサポートし、これらのメッセージ・タイプ内のデータを検証します。QuickFIXエンジンでサポートされていないメッセージがOracle Stream Analyticsアプリケーションに必要である場合、デフォルトのQuickFIXメッセージ・ハンドラを拡張し、適切なハンドラ・メソッドをオーバーライドすることにより、カスタム・ハンドラを作成する必要があります。

QuickFIXアダプタは、次のQuickFIXバージョンをサポートしています。各QuickFIXバージョンの下にリストされているメッセージはサポートされていません。

QuickFIXバージョン4.0

次のメッセージ・タイプはこのバージョンでサポートされていません。

Heartbeat、Logon、TestRequest、ResendRequest、Reject、SequenceReset、Logout

QuickFIXバージョン4.1

次のメッセージ・タイプはこのバージョンでサポートされていません。

Heartbeat、Logon、TestRequest、ResendRequest、Reject、SequenceReset、Logout

QuickFIXバージョン4.2

次のメッセージ・タイプはこのバージョンでサポートされていません。

Heartbeat、Logon、TestRequest、ResendRequest、Reject、SequenceReset、Logout

QuickFIXバージョン4.3

次のメッセージ・タイプはこのバージョンでサポートされていません。

Heartbeat、Logon、TestRequest、ResendRequest、Reject、SequenceReset、Logout

QuickFIXバージョン4.4

次のメッセージ・タイプはこのバージョンでサポートされていません。

Heartbeat、Logon、TestRequest、ResendRequest、Reject、SequenceReset、Logout

4.13.2 QuickFixアダプタの構成

現在、Oracle JDeveloperには、QuickFixアダプタ用のコンポーネントは用意されていません。ただし、Oracle Stream Analyticsアプリケーション用のアセンブリ・ファイルおよび構成ファイルにエントリを追加することにより、QuickFixアダプタを作成できます。

アセンブリ・ファイル

<wlevs:adapter id="QuickFIXInbound" provider="quickfix-inbound"/>

構成ファイル

この構成は、少なくとも1つのdefault-session要素を必要とし、ゼロ以上のセッション要素を設定できます。session要素は、特定のQuickFixセッションに使用される構成設定のグループを表します。複数のセッションが必要である場合、共通構成がdefault-session要素にグループ化されます。デフォルトでは、すべてのsessionタグが、default-sessionタグで宣言されているすべての要素を継承します。

config-name要素内のBeginString値は、使用されているFIXメッセージのバージョンを示します。BeginStringデータはQuickFIXエンジンによって検証されません。

http://quickfixj.org/quickfixj/usermanual/1.5.3/usage/configuration.htmlにあるドキュメントによると、必須およびサポート対象の識別子フィールドは、BeginString、SenderCompIDおよびTargetCompIDです。

SenderSubID、SenderLocationID、TargetSubIDおよびTargetLocationIDなどの他のフィールドは必須ではなく、リリース12.1.3ではサポートされていません。

<quickfix-adapter>
<name>quickfixAdpater</name>
<event-type>MyConfigEvent</event-type>
<default-session description="default configuration">
...
<configuration description="identifier-message format">
<config-name>BeginString</config-name>
<config-value>FIXT.0.1</config-value>
</configuration>
</default-session>
<session description="ordertracker configuration">
<configuration description="identifier-acceptor">
<config-name>SenderCompID</config-name>
<config-value>QA</config-value>
</configuration>
<configuration description="identifier-initiator">
<config-name>TargetCompID</config-name>
<config-value>ORACLE</config-value>
</configuration>
</session>
</quickfix-adapter>

4.13.3 ソケットベースのアクセプタのフェイルオーバーの構成

共有MessageStoreを使用して2つのアクセプタ・プロセスを実行することにより、ソケット・ベースのアクセプタ用の単純なフェイルオーバー・スキームを構成できます。1つのプロセスはアクティブ・アクセプタであり、もう1つのプロセスは任意のセッションに対してスタンバイしています。1つのアクセプタ・プロセスが終了すると、フェイルオーバー・アドレスを使用して構成されているクライアントが別のアクセプタにログオンしようとします。ログオンに成功すると、このセッションのメッセージ・ストアがリフレッシュされ、フェイルオーバー・セッションは正常に機能し続けます。

フェイルオーバー・スキームが正常に機能するには、次の構成設定が必要です。

RefreshMessageStoreAtLogon=Y
SocketConnectPort1=8392
SocketConnectHost1=8.8.8.8
SocketConnectPort2=2932
SocketConnectHost2=12.12.12.12

4.14 RESTアダプタ

Representational State Transfer (REST)インバウンド・アダプタは、HTTPプロトコルを介して外部クライアントからHTTPポスト・データを受信します。RESTアダプタでは、XML、CSVおよびJavaScript Object Notation (JSON)でデータを受信し、そのデータをインバウンドRESTアダプタで構成されたOracle Stream Analyticsイベントに変換できます。

データをイベントに変換するために、RESTアダプタはJava Architecture for XML Binding (JAXB)マッパーおよびCSVマッパーを必要とします。マッパーは、受信データのマーシャリングおよびアンマーシャリングを実装するJavaBeanクラスです。

現在、Oracle JDeveloperには、RESTアダプタ用のコンポーネントは用意されていません。ただし、Oracle Stream Analyticsアプリケーション用のアセンブリ・ファイルおよび構成ファイルにエントリを追加することにより、RESTアダプタを作成できます。

アセンブリ・ファイル

次のアセンブリ・ファイルは、XML、CSVおよびJSONタイプの入力データを処理するインバウンドRESTアダプタの設定を示します。

<bean id="xmlMapperBean" class="com.oracle.cep.mappers.jaxb.JAXBMapperFactory"
factory-method="create" />
<bean id="csvMapperBean" class="com.oracle.cep.mappers.csv.CSVMapper" />

<bean id="jsonMapperBean"
class="com.oracle.cep.mappers.jaxb.JAXBMapperFactory"
factory-method="create" />
<wlevs:adapter id="restInbound" provider="rest-inbound">
<wlevs:instance-property name="mapper" ref="xmlMapperBean" />
<wlevs:instance-property name="csvMapper" ref="csvMapperBean" />
<wlevs:instance-property name="eventTypeName" value="CallCenterActivity" />
<wlevs:instance-property name="contextPath" value="/testhttpadapter" />
</wlevs:adapter>

次のアセンブリ・ファイルは、イベントをXMLまたはJSONコンテンツ・タイプにアンマーシャリングするアウトバウンドRESTアダプタの設定を示します。

<wlevs:adapter id="restXmlOutbound" provider="rest-outbound">
<wlevs:instance-property name="mapper" ref="xmlMapperBean" />
<wlevs:instance-property
name="url" value="http://localhost:9002/testadapter" />
</wlevs:adapter>

<wlevs:adapter id="restJsonOutbound" provider="rest-outbound">
<wlevs:instance-property name="mapper" ref="jsonMapperBean" />
<wlevs:instance-property name="url"
value="http://localhost:9002/testadapter" />
</wlevs:adapter>

構成ファイル

次の構成ファイルは、POSTデータを受信するためのrest-adapter構成と受信XMLおよびJSONデータを処理するためのjaxb-mapper構成を示しています。

<rest-adapter>
<name>restInbound</name>
<event-type-name>CallCenterActivity</event-type-name>
<context-path>/testhttpadapter</context-path>
</rest-adapter>
<jaxb-mapper>
<name>xmlMapperBean</name>
<event-type-name>CallCenterActivity</event-type-name>
<metadata>external_metadata_case1.xml</metadata>
</jaxb-mapper>
<json-mapper>
<name>jsonMapperBean</name>
<event-type-name>CallCenterActivity</event-type-name>
<media-type>application/json</media-type>
</json-mapper>

次の構成ファイルは、イベントをXMLまたはJSONコンテンツ・タイプにアンマーシャリングするアウトバウンドRESTアダプタの設定を示しています。

<rest-adapter>
<name>restXmlOutbound</name>
<url>http://localhost:9002/testrestadapter</url>
</rest-adapter>

<rest-adapter>
<name>restJsonOutbound</name>
<url>http://localhost:9002/testrestadapter</url>
</rest-adapter>

<jaxb-mapper>
<name>xmlMapperBean</name>
<event-type-name>CallCenterActivity</event-type-name>
<metadata>external_metadata_case1.xml</metadata>
</jaxb-mapper>

<json-mapper>
<name>jsonMapperBean</name>
<event-type-name>CallCenterActivity</event-type-name>
<media-type>application/json</media-type>
</json-mapper>

注意:
XMLコンテンツ・タイプをRESTインバウンドおよびアウトバウンドのアダプタでサポートするには、XMLマッパーを使用します。XML注釈の追加またはJAXBバインディング・ファイルの自動生成は、このリリースではサポートされていません。

4.15 RMIアダプタ

RMIのインバウンド・アダプタおよびアウトバウンド・アダプタを使用して、RMI接続からのイベント情報の読取りおよびRMI接続へのイベント情報の書込みを行います。RMIアダプタを作成する上で最適な方法は、Oracle JDeveloperコンポーネント・ウィンドウを使用する方法です。

Oracle JDeveloperによって生成された次のアセンブリおよび構成ファイルは、RMIのインバウンド・アダプタおよびアウトバウンド・アダプタの構成を示します。

注意:

RMIクライアント接続を閉じることはできません。http://docs.oracle.com/javase/8/docs/technotes/guides/rmi/faq.htmlで、質問F1を参照してください。

アセンブリ・ファイル

インバウンドRMIアダプタにはJNDI名があり、これにより、インバウンド・クライアントはEPNを特定できます。

<wlevs:adapter id="rmi-inbound-adapter" provider="rmi-inbound">
<wlevs:instance-property name="jndiName"
value="TradeReportApplication.TradeReport/rmi-inbound-adapter"/>
</wlevs:adapter>
<wlevs:adapter id="rmi-outbound-adapter" provider="rmi-outbound"/>

構成ファイル

RMIアウトバウンド・アダプタは、JNDI名を使用してイベント・データの出力リソースを特定します。JNDIプロバイダにより、ディレクトリ・サービス実装をJNDIフレームワークにプラグインできるようになります。

次の例では、JNDIプロバイダはデフォルトのOracle WebLogic T3クライアントです。Oracle WebLogic T3クライアントは、Oracle T3プロトコルを使用してOracle WebLogic Serverと通信するJava RMIクライアントです。通常、T3クライアントは他のクライアント・タイプより性能が優れています。

<rmi-adapter>
<name>rmi-outbound-adapter</name>
<jndi-name>RMIOutboundJNDIName</jndi-name>
<jndi-provider-url>t3://localhost:7001</jndi-provider-url>
<jndi-factory>weblogic.jndi.WLInitialContextFactory</jndi-factory>
</rmi-adapter>

4.16 Twitterアダプタ

インバウンドTwitterアダプタを使用して、ツイートを読み取ることができます。

インバウンド・アダプタでは、Twitter APIを使用してTwitterからツイートを読み取り、これらのツイートをインバウンド・チャネルを介してプロセッサに送信します。また、このアダプタでは、ハッシュタグ、ユーザー、言語などの各種フィルタ・オプションに基づいてツイートをフィルタ処理します。これらの操作の入力は、インバウンド・アダプタから取得されます。

Twitterアダプタを使用すると、Twitterインバウンド・アダプタを使用してEPN図を作成し、任意のアウトバウンド・アダプタに接続できます。

この項には、次の項目が含まれます。

- Twitterアダプタの構成

- Twitterアダプタの依存関係

- Twitterインバウンド・アダプタ

- フィルタ・オプションを使用した例

4.16.1 Twitterアダプタの構成

インバウンドとアウトバウンドの両方のアダプタについて、最小限の構成を行う必要があります。

<wlevs:instance-property name="oauthConsumerKey" value="XXXXXXXXXXXX" />
<wlevs:instance-property name="oauthConsumerSecret" value="XXXXXXXXXXX" />
<wlevs:instance-property name="oauthAccessToken" value="XXXX-XXXXXXX" />
<wlevs:instance-property name="oauthAccessTokenSecret" value="XXXXXXXXX" />
<wlevs:instance-property name="httpProxyHost" value="www-proxy.us.oracle.com" />
<wlevs:instance-property name="httpProxyPort" value="80" />

4.16.2 Twitter アダプタの依存関係

Twitterアダプタは、次のtwitter4jライブラリに依存します。

- twitter4j-core

- twitter4j-async

- twitter4j-stream

4.16.3 Twitterインバウンド・アダプタ

Twitterインバウンド・アダプタでは、Twitterからツイートを受信するフィルタ・ストリーミング・モードが提供されます。

使用できるフィルタ・オプションは、次のとおりです。複数値には、カンマ区切り値(csv)を使用できます。

- Filter: アダプタの構成時に提供されるフィルタ・オプションに基づいてツイートをフィルタします。使用できるフィルタ・オプションは、次のとおりです。

- hashtagsToTrack: #記号を使用せずに追跡するために、ハッシュタグ用の文字列を指定します。

- usersToTrack: ユーザーのツイートを追跡するために、長いTwitterユーザーIDまたはユーザー・ハンドルを指定します。

- languagesToTrack: 特定言語のツイートをフィルタ処理するために言語コードを指定します。

注意:
アダプタの構成時には、少なくともhashtagsToTrackとusersToTrackのいずれかのプロパティを指定する必要があります。

注意
hashtagsToTrackとusersToTrackの両方を指定する場合は、論理演算子ORを使用します。詳細は、https://dev.twitter.com/streaming/reference/post/statuses/filterを参照してください。

注意:
Twitter APIには、APIレート制限があります。詳細は、https://dev.twitter.com/rest/public/rate-limitingを参照してください。

サポートされる言語

次の表は、Webサイト・ウィジェットおよびボタンについてTwitterでサポートされる言語を一覧表示しています。

表4-2 サポートされる言語および言語コード

名前

言語コード

英語(デフォルト)

en

アラビア語

ar

ベンガル語

bn

チェコ語

cs

デンマーク語

da

ドイツ語

de

ギリシャ語

el

スペイン語

es

ペルシア語

fa

フィンランド語

fi

フィリピン語

fil

フランス語

fr

ヘブライ語

he

ヒンディー語

hi

ハンガリー語

hu

インドネシア語

id

イタリア語

it

日本語

ja

韓国語

ko

マレー語

msa

オランダ語

nl

ノルウェー語

no

ポーランド語

pl

ポルトガル語

pt

ルーマニア語

ro

ロシア語

ru

スウェーデン語

sv

タイ語

th

トルコ語

tr

ウクライナ語

uk

ウルドゥー語

ur

ベトナム語

vi

中国語(簡体字)

zh-cn

中国語(繁体字)

zh-tw

注意:
Twitter Webサイトによると、zh-cn言語コードは簡体字中国語を表し、zh-twは繁体字中国語を表します。ただし、Twitterメタデータでは、中国語にはzhのみが定義されています。このため、Twitterインバウンド・アダプタでは、zh言語コードを簡体字中国語と繁体字中国語の両方に使用します。

詳細は、https://dev.twitter.com/web/overview/languagesを参照してください。

4.16.4 フィルタ・オプションを使用した例

この例は、フィルタ・オプションを使用するコンテンツ・ファイルです。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:osgi="http://www.springframework.org/schema/osgi"
xmlns:wlevs="http://www.bea.com/ns/wlevs/spring"
xmlns:jdbc="http://www.oracle.com/ns/ocep/jdbc"
xmlns:hadoop="http://www.oracle.com/ns/oep/hadoop"
xmlns:nosqldb="http://www.oracle.com/ns/oep/nosqldb"
xsi:schemaLocation=" http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/osgi
http://www.springframework.org/schema/osgi/spring-osgi.xsd
http://www.bea.com/ns/wlevs/spring
http://www.bea.com/ns/wlevs/spring/ocep-epn.xsd
http://www.oracle.com/ns/ocep/jdbc
http://www.oracle.com/ns/ocep/jdbc/ocep-jdbc.xsd
http://www.oracle.com/ns/oep/hadoop
http://www.oracle.com/ns/oep/hadoop/oep-hadoop.xsd
http://www.oracle.com/ns/oep/nosqldb
http://www.oracle.com/ns/oep/nosqldb/oep-nosqldb.xsd">
<wlevs:event-type-repository>
<wlevs:event-type type-name="tweetEvent">
<wlevs:class>com.bea.wlevs.sample.Tweet</wlevs:class>
</wlevs:event-type>
</wlevs:event-type-repository>
<wlevs:adapter id="twitteradapter" provider="twitter-inbound">
<wlevs:listener ref="inboundchannel"/>
<wlevs:instance-property name="streamingMode" value="filter" />
<wlevs:instance-property name="hashtagsToTrack" value="IndvsSA" />
<wlevs:instance-property name="usersToTrack" value="338674755" />
<wlevs:instance-property name="languagesToTrack" value="en"/>
<wlevs:instance-property name="oauthConsumerKey" value="XXXXXX" />
<wlevs:instance-property name="oauthConsumerSecret" value="XXXXXX" />
<wlevs:instance-property name="oauthAccessToken" value="XXXX-XXXX" />
<wlevs:instance-property name="oauthAccessTokenSecret" value="XXXXXXXX" />
<wlevs:instance-property name="httpProxyHost" value="www-proxy.us.oracle.com" />
<wlevs:instance-property name="httpProxyPort" value="80" />
</wlevs:adapter>
<wlevs:channel id="inboundchannel" event-type="tweetEvent">
<wlevs:listener ref="tweetprocessor"/>
</wlevs:channel>
<wlevs:processor id="tweetprocessor"/>
<wlevs:channel id="outboundchannel" event-type="tweetEvent">
<wlevs:listener ref="twiiteroutbountadapter"/>
<wlevs:source ref="tweetprocessor"/>
</wlevs:channel>
<wlevs:adapter id="twiiteroutbountadapter" class="com.bea.wlevs.sample.OutputBean" advertise="true"/>
</beans>

4.17 MQTTアダプタ

MQTTインバウンド/アウトバウンド・アダプタにより、構成されたホスト上のMQTTブローカで設定されたトピックからすべてのMQTTメッセージが受信され、変換されて、ダウンストリームに送信されます。

MQTTブローカは、メッセージ・フローに使用されるトピックに必要なインフラストラクチャを管理します。MQTTメッセージは、インバウンド・アダプタによって受信され、Oracle Stream Analyticsイベント・タイプに変換されます。変換されたメッセージはダウンストリームに送信され、ここで複合イベントに処理されるか、またはCQL問合せに基づいてフィルタ処理されます。その後、これらはOracle Stream Analyticsシンクに出力されます。複数のブローカURLを指定した場合、MQTTアダプタにより、serverURIリストに存在するブローカURLに基づいて、MQTTから最初に接続可能なブローカにメッセージが送信されます。serverURIの一部として、複数のブローカURLを指定できます。これらのURIをMQTTアダプタのMqttConnectOptions.setServerURIs()に設定すると、設定したURIがブローカとの接続の構築に使用されます。

接続の試行を開始する際、クライアントでは、リスト内の最初のserverURIから開始し、サーバーとの接続が確立されるまでリストを処理します。どのサーバーにも接続できない場合、接続試行は失敗します。クライアントが接続可能なサーバーのリストを指定することには、次の用途があります。

- 高可用性および信頼性のあるメッセージ配信。

- 一部のMQTTサーバーでは、複数の同等なMQTTサーバーが状態を共有する高可用性機能がサポートされます。

- MQTTクライアントでは、同等なサーバーのいずれかに接続し、どのサーバーにクライアントが接続したとしても、メッセージが確実に配信され、恒久サブスクリプションが保持されることが保証されます。

- 恒久サブスクリプションおよび信頼性のあるメッセージ配信が必要な場合、cleansessionフラグをfalseに設定する必要があります。

ハント・リスト

同等ではないサーバーのセットが指定される可能性があります(高可用性オプションでの場合)。サーバー間で状態が共有されないため、信頼性のあるメッセージ配信および恒久サブスクリプションは無効となります。ハント・リスト・モードを使用する場合、cleansessionフラグをtrueに設定する必要があります。

依存関係

主要な外部の依存関係は、次のMQTTクライアントJARファイル上にあります。

org.eclipse.paho.mqtt-client-0.4.0.jar

これは、MQTT 3.1.1をサポートします。

インストール

MQTTアダプタに関する特別なインストール要件はありません。これは、他のアダプタJARと類似しています。JAR名はcom.oracle.cep.adapters.mqtt.jarです。

このJARは、<INSTALL_HOME>/oep/modulesフォルダにあるインストーラの一部として使用できます。サーバーの一部に含めるには、これをbundleloader.xmlファイルに追加する必要があります。

<bundle>
<startlevel>3</startlevel>
<location>oep/modules</location>
<name>com.oracle.cep.adapters.mqtt.jar</name>
</bundle>

OSGiバンドルはレベル3で開始します。

インバウンド・アダプタ

インバウンド・アダプタにより、組込みマッパーまたはカスタム・コンバータを使用してメッセージが変換されます。メッセージ・データがCSV、JSONおよびXMLである可能性が高い場合は、デフォルトのマッパーを使用できます。

アウトバウンド・アダプタ

アウトバウンド・アダプタにより、EventProcessingイベントをMQTTトピックにパブリッシュできます。その後、変換されたトピックを別のインバウンド・アダプタまたは別のシステムで選択できます。

MQTTインバウンド/アウトバウンド・アダプタをEPNまたはOracle Stream Analyticsアプリケーションのいずれかの一部として使用できます。

注意:
MQTTアダプタを使用するには、MQTTブローカをインストールする必要があります。

4.17.1 MQTT構成パラメータ

インバウンドとアウトバウンドのアダプタには、いずれも構成する必要のあるパラメータが含まれます。これらの表は、何が必須で何がオプションなのかを示します。

MQTTインバウンド構成

インバウンドMQTTアダプタの構成パラメータは、次のとおりです。

表4-3 MQTTインバウンド・アダプタの構成パラメータ

プロパティ名

データ型

必須かどうか

説明

serverURIs

java.lang.String

はい

クライアントが接続可能なサーバーURIのカンマ区切りリスト。次に例を示します。

tcp://iot.eclipse.org:1883

topicName

java.lang.String

はい

クライアントがサブスクライブするトピックのカンマ区切りリスト。各値にワイルドカードを使用できます。

qualityOfService

java.lang.String

いいえ

指定した各トピックのQoSのカンマ区切りのリスト。有効な値は0 (多くても1回)、1 (少なくとも1回)および2 (正確に1回)です。何も指定されていない場合は、デフォルトで1に設定されます。

loadBalanceEnabled

java.lang.Boolean

いいえ

クラスタ内のすべてのメンバーが集合的に機能して負荷を処理するよう強制するには、このプロパティをtrueに設定します。デフォルトではこのプロパティはfalseです。

clientId

java.lang.String

いいえ

一意のクライアント識別子。指定されていない場合、自動的に生成されます。

persistenceType

java.lang.String

いいえ

指定されたQoSへの配信を可能にする、処理中のメッセージの永続データ・ストア。有効な値はmemoryとfileです。何も指定されていない場合は、デフォルトでmemoryに設定されます。

directory

java.lang.String

はい

persistenceTypeプロパティがfileに設定されている場合、このプロパティは必須です。メッセージの格納に使用する必要があるフォルダを指定します。

mapper

com.oracle.cep.mappers.api.Mapper

いいえ

トピックからイベント・タイプにメッセージを変換するために使用されるマッパー・オブジェクト。通常はSX/OEP開発者が、CSV、JSON、XMLなどの組込みマッパーのインスタンスを設定しますが、アダプタにより、カスタム・マッパーの実装を処理できます。

eventTypeName

java.lang.String

はい

mapperプロパティがCSVマッパーを使用するように設定されている場合、このプロパティは必須です。処理されるイベント・タイプを指定します。

converter

oracle.ateam.sx.adapters.mqtt.api.InboundConverter

いいえ

トピックからイベント・タイプにメッセージを変換するために使用されるコンバータ・オブジェクト。コンバータにより、開発者が変換ロジックを実装するための方法が提供されます。また、QoSや複製および保持されたメッセージ・メタデータを読み取ることもできます。

cleanSession

java.lang.Boolean

いいえ

再起動および再接続後の状態をクライアントとサーバーのどちらに保存する必要があるかを指定します。デフォルトで、サブスクリプションが非恒久であることを意味するtrueに設定されます。

userName

java.lang.String

いいえ

接続に使用するユーザー名。

password

java.lang.String

いいえ

接続に使用するパスワード。

sslContextProvider

java.lang.String

いいえ

接続に使用するSSLコンテキスト・プロバイダ。

sslKeyStore

java.lang.String

いいえ

接続に使用するSSLキーストア。

sslKeyStorePassword

java.lang.String

いいえ

接続に使用するSSLキーストア・パスワード。

sslKeyStoreType

java.lang.String

いいえ

接続に使用するSSLキーストア・タイプ。

sslKeyStoreProvider

java.lang.String

いいえ

接続に使用するSSLキーストア・プロバイダ。

sslTrustStore

java.lang.String

いいえ

接続に使用するSSLトラスト・ストア。

sslTrustStorePassword

java.lang.String

いいえ

接続に使用するSSLトラスト・ストア・パスワード。

sslTrustStoreType

java.lang.String

いいえ

接続に使用するSSLトラスト・ストア・タイプ。

sslTrustStoreProvider

java.lang.String

いいえ

接続に使用するSSLトラスト・ストア・プロバイダ。

autoReconnect

java.lang.Boolean

いいえ

接続が失われた場合、自動的に再接続する必要があるかどうかを指定します。デフォルトでtrueに設定されます。

connectionTimeout

java.lang.Integer

いいえ

接続タイムアウト値。この値(秒単位)は、MQTTサーバーへのネットワーク接続が確立されるのをクライアントで待機する最大時間間隔を定義します。デフォルト値は30秒です。

keepAliveInterval

java.lang.Integer

いいえ

キープ・アライブ間隔。この値(秒単位)は、送信メッセージまたは受信メッセージの最大時間間隔を定義します。これにより、クライアントでは、TCP/IPタイムアウトの期間待機せずに、サーバーが使用不可になったかどうかを検出できます。デフォルト値は60秒です。

connectionWaitTime

java.lang.Integer

いいえ

接続を確立できるまで待機する時間(秒単位)。これにより、アダプタが適切に接続するための時間を許可します。デフォルト値は1秒です。

connectionAttempts

java.lang.Integer

いいえ

アダプタにより接続が試行される試行回数。デフォルト値は3回の試行です。ゼロ(0)に設定されている場合、永久的に試行されます。

connectionDelay

java.lang.Integer

いいえ

暫定的な接続が失敗した後に待機する時間(秒単位)。この遅延は、暫定的な接続のたびに発生します。デフォルト値は5秒です。

MQTTアウトバウンド構成

アウトバウンドMQTTアダプタの構成パラメータは、次のとおりです。

表4-4 MQTTアウトバウンド・アダプタの構成パラメータ

プロパティ名

データ型

必須かどうか

説明

serverURIs

java.lang.String

はい

クライアントが接続可能なサーバーURIのカンマ区切りリスト。次に例を示します。

tcp://iot.eclipse.org:1883

topicName

java.lang.String

はい

クライアントがサブスクライブするトピックのカンマ区切りリスト。各値にワイルドカードを使用できます。

qualityOfService

java.lang.String

いいえ

指定した各トピックのQoSのカンマ区切りのリスト。有効な値は0 (多くても1回)、1 (少なくとも1回)および2 (正確に1回)です。何も指定されていない場合は、デフォルトで1に設定されます。

clientId

java.lang.String

いいえ

一意のクライアント識別子。指定されていない場合、自動的に生成されます。

persistenceType

java.lang.String

いいえ

指定されたQoSへの配信を可能にする、処理中のメッセージの永続データ・ストア。有効な値はmemoryとfileです。何も指定されていない場合は、デフォルトでmemoryに設定されます。

directory

java.lang.String

はい

persistenceTypeプロパティがfileに設定されている場合、このプロパティは必須です。メッセージの格納に使用する必要があるフォルダを指定します。

mapper

com.oracle.cep.mappers.api.Mapper

いいえ

イベント・タイプをメッセージを変換するために使用されるマッパー・オブジェクト。通常はSX/OEP開発者が、JSONやXMLなどの組込みマッパーのインスタンスを設定しますが、アダプタにより、提供されている任意のタイプのJAXBベース・マッパーを処理できます。

converter

oracle.ateam.sx.adapters.mqtt.api.OutboundConverter

いいえ

イベント・タイプをメッセージを変換するために使用されるコンバータ・オブジェクト。コンバータにより、開発者が変換ロジックを実装するための方法が提供されます。また、QoSや複製および保持されたメッセージ・メタデータを書き込むこともできます。

cleanSession

java.lang.Boolean

いいえ

再起動および再接続後の状態をクライアントとサーバーのどちらに保存する必要があるかを指定します。デフォルトで、サブスクリプションが非恒久であることを意味するtrueに設定されます。

userName

java.lang.String

いいえ

接続に使用するユーザー名。

password

java.lang.String

いいえ

接続に使用するパスワード。

sslContextProvider

java.lang.String

いいえ

接続に使用するSSLコンテキスト・プロバイダ。

sslKeyStore

java.lang.String

いいえ

接続に使用するSSLキーストア。

sslKeyStorePassword

java.lang.String

いいえ

接続に使用するSSLキーストア・パスワード。

sslKeyStoreType

java.lang.String

いいえ

接続に使用するSSLキーストア・タイプ。

sslKeyStoreProvider

java.lang.String

いいえ

接続に使用するSSLキーストア・プロバイダ。

sslTrustStore

java.lang.String

いいえ

接続に使用するSSLトラスト・ストア。

sslTrustStorePassword

java.lang.String

いいえ

接続に使用するSSLトラスト・ストア・パスワード。

sslTrustStoreType

java.lang.String

いいえ

接続に使用するSSLトラスト・ストア・タイプ。

sslTrustStoreProvider

java.lang.String

いいえ

接続に使用するSSLトラスト・ストア・プロバイダ。

autoReconnect

java.lang.Boolean

いいえ

接続が失われた場合、自動的に再接続する必要があるかどうかを指定します。デフォルトでtrueに設定されます。

connectionTimeout

java.lang.Integer

いいえ

接続タイムアウト値。この値(秒単位)は、MQTTサーバーへのネットワーク接続が確立されるのをクライアントで待機する最大時間間隔を定義します。デフォルト値は30秒です。

keepAliveInterval

java.lang.Integer

いいえ

キープ・アライブ間隔。この値(秒単位)は、送信メッセージまたは受信メッセージの最大時間間隔を定義します。これにより、クライアントでは、TCP/IPタイムアウトの期間待機せずに、サーバーが使用不可になったかどうかを検出できます。デフォルト値は60秒です。

connectionWaitTime

java.lang.Integer

いいえ

接続を確立できるまで待機する時間(秒単位)。これにより、アダプタが適切に接続するための時間を許可します。デフォルト値は1秒です。

4.17.2 MQTTレシーバEPN

このサンプルのEPNは、MQTTインバウンド・アダプタの使用方法およびMQTTトピックのサブスクライブ方法を示します。

このEPNは、MQTTブローカ上のtemperaturesという名前のトピックをサブスクライブします。MQTTブローカは、指定されたサーバーURI上で実行されます。これは、高可用性機能を示します。いずれかのサーバーが失敗した場合でも、他のサーバーに安全にスイッチオーバーします。

インバウンド・アダプタに対して、provider="mqtt-inbound"をコンテキスト・ファイルのアダプタ定義に追加します。

<wlevs:adapter id="mqttInbound" provider="mqtt-inbound">
<wlevs:listener ref="inboundTemperatures"/>
<wlevs:instance-property name="serverURIs" value="tcp://10.191.195.134:1883,tcp://10.191.211.254:1884" />
<wlevs:instance-property name="topicName" value="temperatures" />
<wlevs:instance-property name="qualityOfService" value="0" />
<wlevs:instance-property name="mapper" ref="jsonMapper" />
</wlevs:adapter>

4.17.3 MQTTセンダーEPN

このサンプルのEPNは、MQTTアウトバウンド・アダプタの使用方法およびMQTTトピックへのイベントのパブリッシュ方法を示します。

このEPNは、MQTTブローカ上のtemperaturesという名前のトピックにパブリッシュします。MQTTブローカは、指定されたサーバーURI上で実行されます。これは、高可用性機能を示します。いずれかのサーバーが失敗した場合でも、他のサーバーに安全にスイッチオーバーします。

アウトバウンド・アダプタに対して、provider="mqtt-outbound"をコンテキスト・ファイルのアダプタ定義に追加します。

<wlevs:adapter id="mqttOutbound" provider="mqtt-outbound">
<wlevs:instance-property name="serverURIs" value="tcp://10.191.195.134:1883,tcp://10.191.211.254:1884" />
<wlevs:instance-property name="topicName" value="temperatures" />
<wlevs:instance-property name="qualityOfService" value="0" />
<wlevs:instance-property name="mapper" ref="jsonMapper" />
</wlevs:adapter>

4.18 Kafkaアダプタ

Kafkaインバウンド・アダプタやカスタム・インバウンド・アダプタなどの使用可能な任意のインバウンド・アダプタを使用してEPN図を作成し、Kafkaアウトバウンド・アダプタに接続できます。

Kafkaインバウンド・アダプタでは、1つ以上のKafkaトピックからメッセージを読み取ることができます。これにより、CSV、JSON、XMLなどのマッパー・プロパティを使用して、これらのメッセージをイベントに変換します。Kafkaアウトバウンド・アダプタでは、JSONやXMLなどのマッパー・プロパティを使用してイベントをメッセージに変換することにより、それらのイベントをKafkaトピックにパブリッシュできます。

Springファイル内のeventTypeNameプロパティは、CSVマッパーがマッパー計画として選択されている場合にのみ必須であり、kafka-inboundおよびkafka-outboundアダプタ構成を参照します。

JSONおよびXMLマッパーが構成されている場合には常に、これらのマッパーは、Javaクラスを使用してイベント・タイプに関連付けられます。マッパーとともに使用しない場合、(宣言的に定義された)タプル・イベントを使用できます。サンプルのコンテキスト・コンテンツは次のとおりです。

<wlevs:event-type-repository>
<wlevs:event-type type-name="sx-34-2-Explore_kafka_with_bigdecimal-2">
<wlevs:class>
oracle.wlevs.strex.generated.sx_34_2_Explore_kafka_with_bigdecimal_2
</wlevs:class>
</wlevs:event-type>
</wlevs:event-type type-name="sx-34-2-Explore_kafka_with_bigdecimal-3">
<wlevs:properties>
<wlevs:property name="sensorId" type="java.lang.String"/>
<wlevs:property name="sensorValue" type="bigdecimal"/>
</wlevs:properties>
</wlevs:event-type>
<wlevs:event-type type-name="sx-34-2-Explore_kafka_with_bigdecimal-1">
<wlevs:properties>
<wlevs:property name="sensorId" type="java.lang.String"/>
<wlevs:property name="sensorValue" type="bigdecimal"/>
</wlevs:properties>
</wlevs:event-type>
</wlevs:event-type-repository>
<bean class="com.oracle.cep.mappers.csv.CSVMapper" id="csvMapperBean"/>
<bean class="com.oracle.cep.mappers.jaxb.JAXBMapperFactory" factory-method="create" id="jsonMapperBean">
<property name="eventTypeName" value="sx-34-2-Explore_kafka_with_bigdecimal-2"/>
<property name="mediaType" value="application/json"/>
</bean>

依存関係

Kafkaインバウンドおよびアウトバウンドのアダプタは、次のライブラリに依存します。

表4-5 Kafkaアダプタの依存関係

ライブラリ

バージョン

ライブラリ名

Apache Kafka

2.10-0.8.2.1

kafka_2.10-0.8.2.1.jar

Apache kafkaクライアント

0.8.2.1

kafka-clients-0.8.2.1.jar

メトリック・コア・ライブラリ

2.2.0

metrics-core-2.2.0.jar

Scala標準ライブラリ

2.10.4

scala-library-2.10.4.jar

ZooKeeper

3.4.6

zookeeper-3.4.6.jar

ZkClient

0.3

zkclient-0.3.jar

インストール要件

Oracle Stream Analytics Kafkaアダプタを使用するには、ZookeeperおよびKafkaをインストールして実行する必要があります。次の手順を使用して、ローカル開発Linux環境でKafkaを設定できます。

1. Apache Kafkaをhttp://kafka.apache.org/downloads.htmlからダウンロードします。

2. ダウンロードされたファイルの内容をフォルダに抽出します。

3. 端末のウィンドウを開きます。

4. 端末のウィンドウで、内容を抽出した場所からbinフォルダにナビゲートします。

5. ./zookeeper-server-start.sh ../config/zookeeper.propertiesを実行します。

6. 別の端末ウィンドウを開きます。これは2つ目の端末になります。

7. 端末のウィンドウで、内容を抽出した場所からbinフォルダにナビゲートします。

8. ./kafka-server-start.sh ../config/server.propertiesを実行します。

次の特性を持つデプロイメントを作成できます。

- localhostで実行し、ポート2181をリスニングする1つのZookeeperインスタンス

- localhostで実行し、ポート9092をリスニングする1つのKafkaブローカ・インスタンス

4.18.1 Kafkaからのメッセージを受信するインバウンド・アダプタ

これは、stocksという名前のトピックをサブスクライブし、継続的にメッセージをフェッチするサンプル・アプリケーションです。

メッセージが受信されると、JSON形式から必要なイベント・タイプに自動的に変換されます。CQLプロセッサにより、イベントはダウンストリームの出力チャネルに送信されます。最後に、これらのイベントは、出力チャネルによってカスタム・アダプタに送信され、このアダプタにより、そのコンテンツが標準の出力コンソールに書き込まれます。

<wlevs:adapter id="kafkaInbound" provider="kafka-inbound">
<wlevs:listener ref="inboundStockQuotes"/>
<wlevs:instance-property name="zookeeper" value="localhost:2181" />
<wlevs:instance-property name="topicName" value="stocks" />
<wlevs:instance-property name="mapper" ref="jsonMapper" />
</wlevs:adapter>

4.18.2 Kafkaにメッセージを送信するアウトバウンド・アダプタ

これは、株価がランダムに生成される株価情報を継続的に作成するサンプル・アプリケーションです。生成間隔は1秒です。

CQLプロセッサでは、これらの株価情報を問い合せて、そのイベントを出力チャネルに送信します。最後に、これらのイベントは、出力チャネルによってKafkaアウトバウンド・アダプタに送信され、このアダプタにより、stocksという名前のトピックにJSON形式で書き込まれます。

<wlevs:adapter id="kafkaOutbound" provider="kafka-outbound">
<wlevs:instance-property name="bootstrapServers" value="localhost:9091,localhost:9092" />
<wlevs:instance-property name="topicName" value="stocks" />
<wlevs:instance-property name="mapper" ref="jsonMapper" />
</wlevs:adapter>

4.18.3 Kafka構成

Kafkaアダプタは、インバウンドとアウトバウンドの両方のアダプタに構成する必要があります。

次の項では、インバウンドおよびアウトバウンドのKakfaアダプタについてサポートされるアダプタ・プロパティを一覧表示しています。

Kafkaインバウンド・アダプタ構成

インバウンドKafkaアダプタの構成パラメータは、次のとおりです。

表4-6 Kafkaインバウンド・アダプタ・プロパティ

プロパティ名

データ型

必須かどうか

説明

zookeeper

java.lang.String

はい

アダプタに、Zookeeperサーバーへの接続方法を通知します。HAに複数のZookeeperサーバーが存在する場合、これらすべてをカンマで区切って示す必要があります。

このプロパティの一般的な値は、localhost:2181です。

topicName

java.lang.String

はい

Kafkaトピックの名前。

groupId

java.lang.String

いいえ

各コンシューマ・プロセスは、グループに属している必要があります。これにより、このプロパティはバインド先グループを通知します。このプロパティに値が設定されていない場合、アダプタにより、serverName + "-" + appName + "-" + adapterIdという表記法を使用して、自動的に値が生成されます。

mapper

com.oracle.cep.mappers.api.Mapper

いいえ

トピックからイベント・タイプにメッセージを変換するために使用されるマッパー・オブジェクト。通常はOracle Stream Analytics開発者が、CSV、JSON、XMLなどの組込みマッパーのインスタンスを設定しますが、アダプタにより、カスタム・マッパーの実装を処理できます。

eventTypeName

com.oracle.cep.mappers.api.Mapper

いいえ

CSVマッパーがマッパー計画として選択されている場合にのみ、必須となります。このプロパティでは、処理されるイベント・タイプを示す必要があります。

converter

com.oracle.cep.adapters.kafka.api.InboundConverter

いいえ

トピックからイベント・タイプにメッセージを変換するために使用されるコンバータ・オブジェクト。コンバータにより、開発者に変換ロジックを実装するための方法が提供されます。また、キー、パーティション、オフセットなどのメッセージ・メタデータを読み取ることもできます。

consumerThreads

java.lang.Integer

いいえ

メッセージ消費のスループットを向上させるために、リスナー・スレッドの作成量が増加するよう、このプロパティを調整できます。

何も指定されていない場合は、デフォルトで1に設定されます。

スレッドの合計数(Oracle Stream Analyticsクラスタ内のすべてのスレッドの合計として算出されます)は、クラスタ側のトピックに設定されたパーティション数に対応している必要があります。

workManagerName

java.lang.String

いいえ

値が指定されていない場合は、デフォルトのワーク・マネージャを使用して、Kafkaトピックからメッセージをリスニングするために使用するスレッドがスケジューリングされます。この動作を変更するには、このプロパティでカスタム・ワーク・マネージャを定義できます。値は、config.xml構成ファイルに設定されたものと同じワーク・マネージャ名にする必要があります。

consumerConfigs

java.util.Properties

いいえ

Oracle Stream Analytics開発者は、これにより、コンシューマAPIに関連する任意のネイティブKafkaプロパティを設定できます。使用可能なプロパティの完全なリストは、http://kafka.apache.org/082/documentation.html#consumerconfigsを参照してください。

Kafkaアウトバウンド・アダプタ構成

アウトバウンドKafkaアダプタの構成パラメータは、次のとおりです。

表4-7 Kafkaアウトバウンド・アダプタ・プロパティ

プロパティ名

データ型

必須かどうか

説明

bootstrapServers

java.lang.String

はい

アダプタに、メンバーの初期ブートストラップ検出を実行する1つ以上のサーバーを(カンマで区切って)示すことにより、Kafkaクラスタへの接続方法を通知します。このプロパティの一般的な値は、localhost:9091、localhost:9092です。

topicName

java.lang.String

はい

Kafkaトピックの名前。

mapper

com.oracle.cep.mappers.api.Mapper

いいえ

イベント・タイプをメッセージを変換するために使用されるマッパー・オブジェクト。通常はOracle Stream Analytics開発者が、JSONやXMLなどの組込みマッパーのインスタンスを設定しますが、アダプタにより、提供されている任意のタイプのJAXBベース・マッパーを処理できます。

converter

com.oracle.cep.adapters.kafka.api.OutboundConverter

いいえ

イベント・タイプをメッセージを変換するために使用されるコンバータ・オブジェクト。コンバータにより、開発者に変換ロジックを実装するための方法が提供されます。また、キーやパーティションなどのメッセージ・メタデータを書き込むこともできます。

partitionProperty

java.lang.String

いいえ

メッセージをどのパーティションに送信し、そのパーティションに関する情報をイベント・タイプのどのプロパティに保持するかを指定します。パーティションの値を設定する場合、開発者は、java.lang.Integerタイプのみを使用するよう考慮する必要があります。

keyProperty

java.lang.String

いいえ

パーティションの特定に使用されるキーに関する情報をイベント・タイプのどのプロパティに保持するかを指定します。開発者は、byte[]と文字列の間から選択してキーの値を設定できますが、他の任意のタイプを使用するとエラーがスローされます。

producerConfigs

java.util.Properties

いいえ

Oracle Stream Analytics開発者は、これにより、プロデューサAPIに関連する任意のネイティブKafkaプロパティを設定できます。使用可能なプロパティの完全なリストは、http://kafka.apache.org/082/documentation.html#producerconfigsを参照してください。

4.19 コヒーレンス・アダプタ

Coherenceキャッシュとは、使用頻度の高いデータへの高速アクセスを提供する、インメモリー分散型キャッシュのことです。イベント処理では、イベントの受信ストリームをリアルタイムで処理する機能が提供されます。Coherenceキャッシュでは、データは分散型インメモリー・キャッシュに格納されます。キャッシュ内の各エントリは、キーと値のペアです。すべてのキャッシュ・データ操作で、ユーザーがキーと値の両方を指定する必要があります。

Coherenceキャッシュでは、次の操作がサポートされます。

- INSERT: 新しい{key,value}ペアを追加します。

- DELETE: 既存の{key,value}ペアを削除します。

- UPDATE: 既存の{key,value}ペアを変更します。

Oracle Stream Analyticsでは、キャッシュの変更イベントを受信データ・ストリームとしてリスニングしたり、出力ストリームをキャッシュに書き込むことができる、即時利用可能な2つのアダプタが提供されます。

4.19.1 コヒーレンス・インバウンド・アダプタ

コヒーレンス・インバウンド・アダプタでは、キャッシュからの変更イベントをリスニングする機能が提供されます。コヒーレンス・インバウンド・アダプタにより、Coherenceキャッシュへのリスナーとしてそのアダプタ自体が登録されます。キャッシュ内のすべてのデータ操作について、キャッシュにより、インバウンド・アダプタに変更の詳細が通知されます。コヒーレンス・インバウンド・アダプタでは、変更イベントを受信するとそれらをEvent Processingイベントに変換して、追加のイベント処理のためにダウンストリームにプッシュします。

キャッシュでは、データ操作のタイプに応じて、次の3つのタイプの変更イベントがサポートされます。

- INSERT: 新しい{key,value}ペアをキャッシュに挿入します。

- DELETE: 既存の{key,value}ペアをキャッシュから削除します。

- UPDATE: 既存の{key,old-value}ペアを{key,new-value}ペアで更新します。

注意:
現在、コヒーレンス・インバウンド・アダプタでは、INSERT変更イベントのみ(キャッシュで受信されるすべての新しい{key,value}ペア)がリスニングされます。キャッシュのUPDATEまたはDELETE操作の結果として生成されるすべての変更イベントは、インバウンド・アダプタによって無視されます。

イベントの順序

Oracle Stream Analyticsコヒーレンス・インバウンド・アダプタでは、キャッシュからの挿入イベントを受信できます。マップ・クラスから継承される、データをキャッシュに挿入するための2つのメソッドがあります。

- put(K key, V value)https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#put-K-Vを参照してください。

- putAll(Map<? extends K,? extends V>M)。https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#putAll-java.util.Mapを参照してください。

挿入されるイベントの順序を特に考慮する場合は、LinkedHashMapを使用して、キャッシュのバッチ挿入操作を実行します。LinkedHashMapクラスでは、挿入されるイベントの順序が保持されます。EventProcessingでは、各イベントがLinkedHashMapに挿入されたとおりの同じ順序でイベントを受信できます。挿入順序を考慮するユーザーは、LinkedHashMapを使用して、キャッシュのバッチ挿入操作を実行する必要があります。

LinkedHashMapを使用したキャッシュのバッチ挿入操作の例は、次のとおりです。

Map batch = new LinkedHashMap();
while(condition)
{
batch.put(k1, v1)
batch.put(k2, v2)
batch.put(k3, v3)
......
}

cohrenceCache.putAll(batch)

EventProcessingコヒーレンス・インバウンド・アダプタでは、元の順序k1、k2、k3を保持した順序で、キャッシュからイベントを受信できます。

構成

Oracle Stream Analyticsアプリケーションにコヒーレンス・インバウンド・アダプタを定義する構成要素は、次のとおりです。

<wlevs:adapter id="coherenceInboundAdapter" provider="coherence-inbound">
<wlevs:instance-property name="cache" ref="OracleCoherenceCache"/>
<wlevs:instance-property name="eventType" value="EmployeeEvent"/>
</wlevs:adapter>

ここで、OracleCoherenceCacheは、アプリケーションEPN構成ですでに定義されているキャッシュ要素です。OracleCoherenceCacheおよびEmployeeEventを参照してください。

構成パラメータ

様々な構成要素の属性とプロパティに関する詳細は、次のとおりです。

- cache - このプロパティは、ユーザーがリスニングする必要がある変更イベントを含むキャッシュを指定します。この値は、EPN構成で定義されているCoherenceキャッシュ要素を参照する必要があります。これは、アダプタ構成の必須プロパティです。

- eventType - このプロパティは、インバウンド・アダプタによってダウンストリーム・ステージに伝播されるイベントのタイプを指定します。このイベント・タイプは、アプリケーションのイベント・タイプ・リポジトリですでに定義されている必要があります。これも、アダプタ構成の必須プロパティです。

ユーザーがイベントをCoherenceキャッシュに入力するとすぐに、キャッシュによってこのことがアダプタに通知され、リスニングするインバウンド・アダプタに変更イベントが提供されます。Coherenceキャッシュにより、リスニングするインバウンド・アダプタに、バインドなしバッファ・キューを保持する変更イベントがプッシュされます。バッファ・キューを保持する理由は、インバウンド・アダプタによって実装されたマップ・リスナー・インタフェースを起動するコールバック・スレッドを返すためです。コヒーレンス・アダプタでは、独自のスレッドでこれらのイベントをデキューし、ダウンストリーム・ステージにプッシュします。アダプタによって変更イベントがデキューされると、受信されたオブジェクトは、eventTypeで指定されたタイプのイベント・オブジェクトに変換されます。

注意:
変更イベント(キャッシュに挿入されるオブジェクト)のタイプは、マップ・エントリが属性名と値のペアである、java.util.Mapである必要があります。

4.19.2 コヒーレンス・アウトバウンド・アダプタ

コヒーレンス・アウトバウンド・アダプタでは、イベントをCoherenceキャッシュに書き込む機能が提供されます。キャッシュはマップであり、キャッシュ内のすべてのエントリは{key, value}ペアの形式であるため、アウトバウンド・アダプタにより、すべてのイベントについてキーが決定され、計算されたキーを使用して該当するイベントがキャッシュに配置されます。

Oracle Stream Analyticsアプリケーションにコヒーレンス・インバウンド・アダプタを定義する構成要素は、次のとおりです。

<wlevs:adapter id="coherenceOutboundAdapter" provider="coherence-outbound">
<wlevs:instance-property name="cache" ref="OracleCoherenceCache"/>
<wlevs:instance-property name="eventType" value="EmployeeEvent"/>
<wlevs:instance-property name="key" value="id"/>
</wlevs:adapter>

ここで、OracleCoherenceCacheは、アプリケーションEPN構成ですでに定義されているキャッシュ要素です。OracleCoherenceCacheおよびEmployeeEventを参照してください。

構成パラメータ

様々な構成要素の属性とプロパティに関する詳細は、次のとおりです。

- cache - このプロパティは、ユーザーが出力ストリームを書き込む必要がある宛先キャッシュを指定します。この値は、EPN構成で定義されているCoherenceキャッシュ要素を参照する必要があります。これは、アダプタ構成の必須プロパティです。

- eventType - このプロパティは、アウトバウンド・アダプタによってダウンストリーム・キャッシュに伝播されるイベントのタイプを指定します。このイベント・タイプは、アプリケーションのイベント・タイプ・リポジトリですでに定義されている必要があります。これも、アダプタ構成の必須プロパティです。

- key - このプロパティは、宛先キャッシュへの送信イベントについてイベント・タイプ定義にキー属性を指定します。

送信イベントがアウトバウンド・アダプタに着信すると、アダプタにより、イベントからキー属性の値がフェッチされます。次に、アダプタにより{key,value}ペアが形成されて宛先キャッシュに書き込まれ、このキャッシュで、キーがイベントのキー属性の値となります。値は、送信イベント・オブジェクトを使用して作成されるjava.util.Mapのインスタンスです。また、アウトバウンド・アダプタは非同期で機能し、すべての送信イベントが格納されるバッファ・キューを管理します。個別の出力スレッドにより、このバッファからイベントがデキューされ、Coherenceキャッシュにプッシュされます。バッファ・キューを保持する理由は、Coherenceキャッシュのput操作の動作のためです。Coherenceキャッシュにより、put操作のたびにすべてのマップ・リスナーが起動されるため、キャッシュ上のいずれかのダウンストリーム・マップ・リスナーでアウトバウンド・アダプタによって開始された各put操作に多くの時間がかかる場合、待機時間が増加する可能性があります。

4.19.3 OracleCoherenceCache

コヒーレンスOracleCoherenceCacheは、次のように、wlevs:cache要素を使用してEPN構成ファイルで定義されます。

<wlevs:caching-system id="coherenceCachingSystem" provider="coherence">
</wlevs:caching-system>
<wlevs:cache id="OracleCoherenceCache" >
<wlevs:caching-system ref="coherenceCachingSystem"/>
</wlevs:cache>

4.19.4 EmployeeEvent

EmployeeEventは、次のように定義されます。

public class EmployeeEvent
{
private int id;
private String name;
private String dept;
private int phone;

public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getDept()
{
return dept;
}
public void setDept(String dept)
{
this.dept = dept;
}
public int getPhone()
{
return phone;
}

5 チャネル

チャネルは、他のタイプのコンポーネント(ステージ)間をイベントが往来する論理的なパイプを表します。たとえば、アダプタとOracle CQLプロセッサ間やOracle CQLプロセッサとイベントBean間などがあります。

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

- チャネルを使用するタイミング

- チャネル構成

- ダウンストリーム・チャネルに出力する問合せの制御

- バッチ処理チャネル

- フォルト処理

- EventPartitionerチャネル

- 分散フロー

5.1 チャネルを使用するタイミング

チャネルには、バッファリング機能、キューイング機能および同時実行性機能が用意されており、これにより、設計ライフサイクルの後半でアプリケーションのパフォーマンスをチューニングできるようになります。

デフォルトでは、チャネルのmax-threads属性は0に設定されており、これは、チャネルがパススルー・モードであり、パフォーマンス・ペナルティが起きないことを意味します。

EPNを構成するとき、次のルールを考慮してください。

- Oracle CQLプロセッサをダウンストリーム・ステージに接続する場合、チャネルは必須です。

- ストリームまたはリレーションをOracle CQLプロセッサに接続する場合、チャネルは必須です。
前述の2点に基づいて、アダプタとプロセッサ間でチャネルを設定することは必須であることに注意してください。Oracle JDeveloperを使用してアダプタをプロセッサに接続する場合、チャネルを作成するためのウィザードが表示されます。『Oracle Stream Analyticsイベント処理スタート・ガイド』のチャネルの作成に関する項を参照してください。

- 外部リレーション、キャッシュまたは表ソースのいずれかのコンポーネントをOracle CQLプロセッサに接続する場合、チャネルはオプションです。

チャネルは、キャッシュや表などのプル・ソースとプロセッサの間では、プル・ソースが外部リレーションを示すため必要ありません。外部リレーションでは、有効な操作はストリームとNOWウィンドウ演算子間の結合のみとなるため、プル・ソースとみなされます。結合は実際には、Oracle CQLプロセッサの外部で発生します。これはプルであるため、Oracle CQLプロセッサはその状態を認識される必要はなく(つまり、DDLは必要ありません)、チャネルで仲介する必要もありません。

通常、コンポーネント間のチャネルは次の場合に使用します。

- バッファリングは、発行するコンポーネントと受信側の間で必要です。

- 受信側のコンポーネントにはキューイングまたは同時実行性が必要です。

- カスタム・アダプタが使用される場合は、スレッド制御が必要です。

5.2 チャネル構成

イベント処理ネットワーク(EPN)にチャネルを追加する場合は、デフォルト構成を使用できます。デフォルトのチャネルは、名前およびIDを持ち、システム・タイムスタンプが付加されたストリーム・チャネルです。デフォルトのハートビートのタイムアウトは100ミリ秒または100,000,000ナノ秒です。

ほとんどのアプリケーションにはデフォルトの構成が適しています。構成を変更するには、アプリケーションのアセンブリ・ファイルを編集するか、コンポーネントの構成ファイルを編集します。

システムによってチャネルにタイムスタンプが付加されている場合、新規イベントが到着したとき、および構成可能なハートビートのタイムアウトが期限切れになったときに、Oracle Stream AnalyticsによりCPUクロックから新しい時間が割り当てられます。

アプリケーションによってチャネルにタイムスタンプが付加されている場合、イベントのタイムスタンプはwlevs:expression要素によって決定されます。標準的な式の例として、イベントでのプロパティへの参照があります。式が指定されていない場合、タイムスタンプは前のイベントから伝播されます。たとえば、1つのOracle CQLプロセッサのシステムによりタイムスタンプが付加されたチャネルが、別のダウンストリームOracle CQLプロセッサのアプリケーションによりタイムスタンプが付加されたチャネルにイベントを送信する場合などです。また、アプリケーションはStreamSender.sendHeartbeatメソッドを使用して、イベント型heart-beatダウンストリームをEPNのStreamSinkリスナーに送信することが可能です。

注:

チャネルがアプリケーションによってタイムスタンプが付加されていると同時にマップベースである(ハッシュ・マップ・イベント・タイプを使用する)場合、Oracle Stream Analyticsによりタイムスタンプが追加されます。キーのない削除または更新操作はこの構成のチャネルに対しては機能しません。これは、アプリケーションによりタイムスタンプが付加されたイベントによって常にtimestampプロパティの変更が回避されるためです。

この章では、いくつかのアセンブリおよび構成ファイルのチャネル設定について説明します。

5.2.1 アセンブリ・ファイル

アセンブリ・ファイルは、helloworldInputChannelのチャネル設定を示します。この設定は、helloworldProcessorがイベントのチャネルをリスニングし、このイベントがhelloworldAdapterからチャネルにフローすることを示します。

<wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
<wlevs:listener ref="helloworldProcessor"/>
<wlevs:source ref="helloworldAdapter"/>
</wlevs:channel>

チャネルをリレーションとして構成するには、次のように、is-relation設定をアセンブリ・ファイルに追加します。

<wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent"
is-relation="true" primary-key="myprimarykey" />

このチャネルをリレーションとして指定する場合は、primary-key属性も構成する必要があります。主キーは、各イベントを一意に識別する空白またはカンマ区切りのイベント・プロパティ名のリストです。プライマリ・キーを定義する方法の詳細は、『Oracle Stream Analyticsスキーマ・リファレンス』のwlevs:metadataに関する項を参照してください。

アプリケーションによってタイムスタンプを付加するチャネルを構成するには、次のように、application-timestampedおよびexpression要素をアセンブリ・ファイルに追加します。is-total-order要素をtrueに設定すると、パブリッシュされたアプリケーション時間が常に前回使用された値よりも大きくなります。

<wlevs:application-timestamped is-total-order="true">
<wlevs:expression>mytime+10</wlevs:expression>
</wlevs:application-timestamped>

5.2.2 構成ファイル

構成ファイルは、チャネル構成の設定を示します。この設定では、プロセス・イベントの非同期バッファリング(max-size)、最大4つのスレッドの使用(max-threads)、および10000ナノ秒のハートビート・タイムアウトの使用(heartbeat)を行うためにチャネルをカスタマイズします。

<channel>
<name>helloworldInputChannel</name>
<max-size>10000</max-size>
<max-threads>4</max-threads>
<heartbeat>10000</name>
</channel>

5.3 ダウンストリーム・チャネルに出力する問合せの制御

複数の問合せを使用してOracle CQLプロセッサを構成する場合、デフォルトではすべての問合せの結果がダウンストリーム・チャネルに送信されます。どの問合せの結果をダウンストリーム・チャネルに送信するかは、selector要素を使用して制御できます。

図5-1は、アップストリームOracle CQLプロセッサfilteredFanoutProcessorに接続されたチャネルfilteredStreamを備えたEPNを示します。

図5-1 Oracle CQLプロセッサおよびダウンストリーム・チャネルを備えたEPN

次の例は、Oracle CQLプロセッサに構成された問合せを示します。

<processor>
<name>filterFanoutProcessor</name>
<rules>
<query id="Yr3Sector"><![CDATA[
select cusip, bid, srcId, bidQty, ask, askQty, seq
from priceStream where sector="3_YEAR"
></query>
<query id="Yr2Sector"><![CDATA[
select cusip, bid, srcId, bidQty, ask, askQty, seq
from priceStream where sector="2_YEAR"
></query>
<query id="Yr1Sector"><![CDATA[
select cusip, bid, srcId, bidQty, ask, askQty, seq
from priceStream where sector="1_YEAR"
></query>
</rules>
</processor>

Oracle CQLプロセッサに複数の問合せを指定する場合、デフォルトでは、すべての問合せ結果がOracle CQLプロセッサのアウトバウンド・チャネルに出力されます(図5-1のfilteredStream)。オプションで、コンポーネント構成ソースでchannel要素のselector子要素を使用し、チャネルに結果を出力する1つ以上のOracle CQL問合せ名のスペース区切りのリストを指定できます。次の例では、問合せYr3SectorおよびYr2Sectorの問合せ結果はfilteredStreamに出力されますが、問合せYr1Sectorの問合せ結果は出力されません。

<channel>
<name>filteredStream</name>
<selector>Yr3Sector Yr2Sector</selector>
</channel>

アップストリームOracle CQLプロセッサに問合せを作成する前に、selectorでchannel要素を構成できます。この場合、selector内の名前と一致する問合せ名を指定する必要があります。

注:

selector子要素は、アップストリーム・ステージがOracle CQLプロセッサである場合にのみ適用できます。詳細は、Oracle CQLプロセッサを参照してください。

5.4 バッチ処理チャネル

デフォルトでは、チャネルはイベントが到達した時点でイベントを処理します。wlevs:channel属性batchingをtrueに設定することで、同じタイムスタンプを持ち、同じ問合せからの出力のイベントをまとめてバッチ処理するように構成できます。

イベントのバッチ処理により、アプリケーションのパフォーマンスを向上させることができます。

<wlevs:channel id="priceStream" event-type="PriceEvent" batching="true">
<wlevs:listener ref="filterFanoutProcessor" />
<wlevs:source ref="PriceAdapter" />
</wlevs:channel>

関連項目:

- RelationSenderの実装

- 『Oracle Stream Analyticsスキーマ・リファレンス』のbatch-sizeに関する項

- 『Oracle Stream Analyticsスキーマ・リファレンス』のbatch-time-outに関する項

5.5 フォルト処理

チャネルのダウンストリーム・ステージで発生し、チャネルにスローされる例外を処理するコードを書き込むことができます。

デフォルトでは、チャネルのフォルト処理動作は次のとおりです。

- チャネルのmax-threads設定が0である場合(パススルー・チャネル)、例外がEPNの次のアップストリーム・ステージに再スローされます。

- チャネルのmax-threads設定が0より大きい場合、例外がログに記録および削除されます。また、フォルトに関連付けられているイベントもログに記録および削除されます。

フォルト処理クラスを書き込み、max-threads値が0より大きいチャネルとハンドラを関連付けることができます。フォルト・ハンドラをチャネルに関連付けると、チャネルにスローされる例外は、フォルトを処理したり再スローするコードが含まれるハンドラで受信されます。フォルト処理コードが例外を再スローする場合、例外はログに記録されますが例外に関連するイベントは失われます。これらの例外に含まれるイベントを追跡する場合、イベント・データをEPNに接続されるデータ・ソースに書き込むことなどによって、コードを使用して永続化する必要があります。

注:

マルチスレッドのチャネルによってスローされた例外を処理するには、プロセッサなどのチャネルのアップストリームにあるコンポーネントにフォルト・ハンドラが登録されている必要があります。アップストリームのコンポーネントにフォルト・ハンドラを登録しない場合、例外はアップストリームに渡されますが、フォルト・ハンドラは呼び出されません。

フォルト・ハンドラの書込みの詳細は、フォルト処理を参照してください。

5.6 EventPartitionerチャネル

デフォルトでは、チャネルは各リスナーに各イベントをブロードキャストします。

EventPartitionerを使用するようにチャネルを構成した場合、受信イベントが到着するたびにチャネルはリスナーを選択し、各リスナーに各イベントをブロードキャストするかわりに、そのリスナーにイベントをディスパッチします。チャネルでEventPartitionerを使用してスケーラビリティを向上できます。

5.7 分散フロー

EPNの静的な関係は、有向非巡回グラフとして表すことができます。つまり、任意のペア(N,C)において、Nはノード(頂点)のセットであり、Cはソース・ノードから宛先ノードまでの結合を表してNをつなぐ2つの場所の関係(辺)を表します。

これは、分散フローと呼ばれます。

分散フローとは、アプリケーション内の一連のイベントのことを指します。分散フローは、コンピュータ・プログラミング言語の変数またはパラメータと同じ目的を果たします。分散フローは、ソフトウェア・レイヤーからの通信状態を表します。分散フローは本来動的なものです。分散フローは、分散プロトコルの部分間の高度な論理関係を表します。

分散フローを使用可能ないくつかのシナリオを次に示します。

- 待機時間がそれほど長いわけではないイベント

- 論理的にパーティション化可能なイベント

- パラレルに実行できる個別のコンポーネント/タスクに論理的に分割可能なイベント

分散フローのプロパティ

通常、分散フローには次のプロパティが含まれます。

1. 非同期で一方向 - 各イベントは単一のインスタンスを表します。

2. 同種で均一 - フロー内のすべてのイベントは均一であり、本質的に似ています。

3. 同時で分散されている - フロー内のイベントは様々な時間(同時)に、様々なノードで(分散されて)発生します。

5.7.1 分散フローの例

分散フローを実際に使用可能ないくつかのシナリオを次に示します。

ワード・カウント

単語数をカウントする必要があるシナリオでは、アプリケーションにより受信する文を意味のある用語にマップした後、これらの用語を(用語別に)件数で表します。ストリーム処理により、Twitterから受信するストリームなど、単語の実際のフローをカウントできます。ただし、ストリーム処理によってこれを行う場合、大量の単語の処理が問題になります。分散処理では、異なるパラレルなTwitterストリームをサブスクライブして、その結果(単語数)をまとめます。

スマート・メーターのエネルギ使用量

現在、家庭では、敷地内に設置されたスマート・メーターを使用して、エネルギ使用量を収集するのが一般的です。通常、これらのスマート・メーターでは、エネルギ使用量のセンサー・データをイベントの形式で1日中定期的(毎分など)に出力します。このセンサー・データは、地域の処理センターでダウンストリーム管理システムによって取得され、家庭や近隣の平均エネルギ使用量などの有用な記述統計およびその地域の履歴データへの関連性を導き出すために使用されます。これらの集計の実行をパーティション化して、エネルギ使用量を効率的に算出できます。分散フローを使用して異常値(一般的な使用量を上回るか、または下回る家庭など)を識別し、将来の使用量を予測できます。このデータを使用して、パートナとのエネルギの購入や販売のプロセスを制御できます。

リスク分析

分散フローを使用して、金融ポートフォリオのエクスポージャをリアルタイムで計算し、これにより、リスクを分析します。

5.7.2 ローカル・パーティション化チャネル

ローカル・パーティション化は、分散フロー内のイベントをパーティション化する際に役立つ技術です。ローカル・パーティション・チャネルでは、順序付けされたイベント・プロパティのセットをパーティション基準として使用する必要があります。チャネル・パーティション化は、チャネルおよびチャネル構成の一部として管理コンソール内にあります。図5-2を参照してください。

ローカル・パーティション化は入力スループットの向上を目的としているため、速度率を測定する場合、アダプタによりプロセッサに送信できる毎秒のイベントを測定する必要があります。

注意:
使用中のマシンのハードウェア容量に適切に基づいて、max-threads値を選択する必要があります。

図5-2 Oracle CQLプロセッサおよびダウンストリーム・チャネルを備えたEPN

セキュリティ

Secure Sockets Layer (SSL)は、分散されたEPNノード間のネットワーク・トラフィックを保護するために使用します。

構成

ローカル・パーティション化をサポートするには、Oracle CQLプロセッサを構成する必要があります。ローカル・パーティション化チャネルの定義およびパラレル問合せ実行用のOracle CQLプロセッサの構成を参照してください。

例

単純なEPNのいくつかの例を次に示します。

例5-1 EPN例1

イベントは、プロパティ名とプロパティ値を表す任意のペア(PN, PV)の関係Pとして定義されます。このマニュアルの目的のために、プロパティ名とプロパティ値のドメインを定義する必要はありません。

EPN1 = ({adapter1, channel1, processor, channel2, adapter2},
{(adapter1,channel1), (channel1, processor), (processor, channel2), (channel2, adapter2)})

例5-2 EPN例2

EPNノードには、複数のイベントが含まれる場合があるため、順序付けされた連続するイベントとしてセットEを定義します。

注意:
Eは、その他のケースとは異なり順序付けされます。

これにより、ランタイム状態S = EPNの(N,E)は、NからEへの2つの場所の関係として表すことができます。関係Sは単射ではなく、同じイベントが複数のノードに存在する場合があることに注意してください。ただし、EPN内にあるイベント・セット全体のすべてのイベントが少なくとも1つのノードに存在する必要があるため、これは全射となります。

e1 = {(price, 10), (volume, 200), (symbol, 'ORCL')}
e2 = {(p1, v1), (p2, v2), (p3, v3)}

6 Oracle CQLプロセッサ

Oracle CQLプロセッサは、様々な入力チャネルおよび他のデータ・ソースからの着信イベントを処理します。Oracle CQLを使用して、着信イベントを処理する連続した問合せの形式でビジネス・ロジックを作成します。Oracle CQLは、イベントをリアルタイムでフィルタ、集計、関連付けおよび処理します。

注意:

Oracle CQLで使用可能な機能を高めるメソッドを使用してJavaクラスを作成できます。Oracle CQL内で、コンパイルされたクラスを名前別に参照し、そのメソッドをSELECT文からコールします。『Oracle CQL言語リファレンス』のSELECT句に関する項を参照してください。

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

- プロセッサのデータ・ソース

- アセンブリ・ファイルおよび構成ファイル

- 問合せ

- CQL集計

- 表ソースの構成

- パラレル問合せ実行用のOracle CQLプロセッサの構成

- フォルト処理

この章では、基本概念を理解しやすいように、例を示しながらOracle CQLの概要を示します。キャッシュに対するCQL問合せの実行の詳細は、キャッシュ済イベント・データを参照してください。『Oracle CQL言語リファレンス』のOracle CQL問合せ、ビューおよび結合に関する項も参照してください。

Oracle JDeveloperには、共通のOracle CQL問合せを作成するためのテンプレートを提供するOracle CQLパターン・コンポーネントが用意されています。『Oracle Stream Analyticsイベント処理スタート・ガイド』のOracle CQLパターンの使用に関する項を参照してください。

この章では、いくつかのアセンブリおよび構成ファイルのOracle CQLプロセッサ設定について説明します。すべてのリファレンスは、『Oracle Stream Analyticsスキーマ・リファレンス』のプロセッサに関する項を参照してください。

6.1 プロセッサのデータ・ソース

Oracle CQLの問合せにより、1つ以上の入力ソースからの着信イベント・データを処理する文、および1つ以上の出力チャネルへの送信イベント・データを送信する文を1つ以上定義できます。

各チャネル(入力または出力)およびデータ・ソースにはイベント・タイプが関連付けられています。

たとえば、1つの入力をチャネルにし、別の入力をCoherenceキャッシュにすることができます。チャネルとCoherenceキャッシュではイベント・タイプが異なります。これは、Coherenceキャッシュが、入力チャネルからの着信イベント・データに関連するがこれと同じではない追加情報をOracle CQLプロセッサの問合せに提供するためです。

複数の問合せを使用してOracle CQLプロセッサを構成する場合、デフォルトではすべての問合せの結果がすべての出力チャネルに出力されます。どの問合せの結果をどの出力チャネルに出力するかは、1つ以上のダウンストリーム・チャネルにselector要素を設定することによって制御できます。selector要素を使用して、結果をこのチャネルに出力できる1つ以上の問合せ名のスペース区切りリストを指定します。出力チャネルに割り当てられたOracle CQL問合せには、出力チャネルに定義されているイベント・タイプと一致する正しい属性があります。詳細は、ダウンストリーム・チャネルに出力する問合せの制御を参照してください。

6.2 アセンブリ・ファイルおよび構成ファイル

Oracle CQLプロセッサをEPNに追加すると、アセンブリ・ファイルに次のエントリが表示されます。

<wlevs:processor id="processor"/>

平均化ルールなどのOracle CQLパターンをOracle JDeveloperでEPNに追加すると、アセンブリ・ファイルに次のエントリが表示されます。

<wlevs:processor id="processor"/>
<wlevs:processor id="averaging-rule"/>

構成ファイル

Oracle CQLプロセッサをEPNに追加すると、構成ファイルに次のエントリが表示されます。デフォルトでは、1つの問合せ用のテンプレートが含まれるルール用のテンプレートを入手できます。

<processor>
<name>processor</name>
<rules>
<query id="ExampleQuery"><![CDATA[
select * from MyChannel [now] >
</query>
</rules>
</processor>

- rules要素は、このプロセッサが実行するOracle CQL文をグループ化します。

- query要素には、Oracle CQLのselect文が含まれます。query要素のid属性は問合せ名を定義します。

- XML CDATAタイプは、Oracle CQLルールを配置する場所を示します。

- select文は実際の問合せです。このテンプレートには、NOWウィンドウおよび最終イベント・ウィンドウに示されているようにnow操作を実行できるよう[now]演算子が用意されています。

6.3 問合せ

次の各項では、株式取引イベントに対して基本的なOracle CQLプロセッサの問合せを実行する方法を示します。

- ストリーム・チャネル

- 時間ベースのリレーション(ウィンドウ)

- プロセッサ出力制御(スライド)

目的

この項の目的は、Oracle CQL問合せでウィンドウ、スライドおよびビューを使用する方法について理解することです。

- ウィンドウを使用すると、イベント・ストリームを時間ベースのイベント・リレーションに変換し、イベントに対してOracle CQL操作を実行できるようになります。時間ベースのリレーション(ウィンドウ)を参照してください。

- スライドを使用すると、イベントをバッチ処理し、CQLプロセッサがイベントを出力する割合を制御できます。プロセッサ出力制御(スライド)を参照してください。

- ビューを使用すると、他のOracle CQL問合せで再使用できるOracle CQL文を作成できます。ビューを参照してください。

イベント・タイプ定義

この項の例で使用される株式取引イベントは、次のフィールドおよび型の定義を持つStockTradeEventTypeタイプです。

- tickerSymbol: String

- price: Double

- dailyHigh: Double

- dailyLow: Double

- closingValue: Double

6.3.1 ストリーム・チャネル

ストリーム・チャネルは、コレクションにイベントを挿入し、次のEPNステージにストリームを送信します。ストリーム内のイベントは連続してフローし、ストリームから削除できず、終わりがありません。アプリケーション内にフローするイベントの連続ストリームに対して問合せを実行できます。

Oracleのティッカ・シンボルを持つすべての株式取引イベントを取得するために、入力ストリーム・チャネルStockTradeIChannelに対する問合せが後に続きます。

SELECT tickerSymbol
FROM StockTradeIStreamChannel
WHERE tickerSymbol = ORCL

次の構成ファイル・エントリはこの問合せを示しています。ISTREAMは、リレーションからストリームへの演算子で説明されているリレーションからストリームへの演算子です。

<processor>
<rules>
<query id=rule1 <![CDATA[ISTREAM (SELECT tickerSymbol
FROM StockTradeIStreamChannel WHERE tickerSymbol = ORCL)>
</query>
</rules>
</processor>

6.3.2 時間ベースのリレーション(ウィンドウ)

リレーション・チャネルは、コレクションにイベントを挿入し、次のEPNステージにリレーションを送信します。リレーションは、最初と最後があるストリーム上の時間のウィンドウです。リレーション内のイベントは、リレーションに挿入、リレーションから削除、およびリレーションで更新することができます。挿入、削除および更新操作の場合、操作が正しいイベントに対して行われるようにリレーション内のイベントが特定の時点を参照している必要があります。リレーションに対する操作はすべて時間ベースで行われます。

ほとんどのアプリケーションではリレーション・チャネルは使用されません。ストリーム・チャネルからの着信イベントに対して時間のウィンドウを設定することにより、時間ベースの処理操作に対してリレーションを作成できます。特定の株式の平均価格を検索するには、平均を計算する時間枠(ウィンドウ)を決定する必要があります。ストリームに対してウィンドウを定義すると、データのコレクションが設定されますが、これらのデータはフローしておらず、ストリームとは異なり、最初と最後があります。このウィンドウはインメモリー・リレーションです。このウィンドウには、AVGなどの関数を適用したり、挿入、更新および削除操作を実行することもできます。

ストリームに対して時間のウィンドウを設定する演算子は、ストリームからリレーションへの演算子と呼ばれます。ストリームからリレーションへの演算子の出力はリレーションです。リレーションからストリームへの演算子を使用して、リレーションをストリームに再変換することにより、すべてのイベント、挿入されたイベントのみ、または削除されたイベントのみが含まれるストリームを出力します。

通常、Oracle CQLプロセッサの出力はストリーム・チャネルに移動するとともに、EPN内の次のステージに移動します。

6.3.2.1 ストリームからリレーションへの演算子

ストリームからリレーションへの演算子は、RANGEおよびROWです。

RANGE演算子

次のように、時間ベースのウィンドウ演算子RANGEを使用して時間のウィンドウを指定できます。

SELECT AVG(price)
FROM StockTradeIStreamChannel [RANGE 1 MINUTE]

この例では、例を理解しやすくするために、範囲は1分(秒単位のティック)に設定されており、1秒ごとに1つの入力イベントが受信されます。問合せにより、ゼロ秒でイベントに含まれる価格の平均化が開始され、値0が出力されます。これは、ゼロ秒のリレーションにはイベントがないためです。次のイベントが1秒で到着した場合、平均価格は最初のイベントの価格になります。次のイベントが2秒で到着した場合、平均価格はリレーション内の2つのイベントの平均になります。これが、59秒(1分)に到達するまで続きます。

時間ベースのウィンドウ操作の重要な概念は、ウィンドウが時間に基づいてイベント・ストリーム上で移動するということです。60秒が経過すると、ウィンドウは1秒移動して1秒から60秒までのイベントの価格が平均化され、さらに60秒が経過すると、ウィンドウはもう1秒移動して2秒から61秒までのイベントの価格が平均化されます。ウィンドウがリレーション上で移動するこの動作は、アプリケーションが動作しているかぎり続きます。

次の構成ファイル・エントリはこの問合せを示しています。ISTREAMは、リレーションからストリームへの演算子で説明されているリレーションからストリームへの演算子です。

<processor>
<rules>
<query id=rule2 <![CDATA[ISTREAM (SELECT AVG(price)
FROM StockTradeIStreamChannel [RANGE 1 MIN >
</query>
</rules>
</processor>

注:

非常に大きな数には接尾辞を付ける必要があります。接頭辞がない場合、Javaでは、非常に大きな数が整数として処理され、値が整数の範囲から外れる可能性があります。この場合、エラーがスローされます。

接頭辞は次のように追加します。

lまたはL: LongfまたはF: floatdまたはD: doublenまたはN: big decimal

例: SELECT * FROM channel0[RANGE 1368430107027000000l nanoseconds]

ROW演算子

次のように、時間ベースのROWS演算子を使用してタプルベースのウィンドウを指定できます。

SELECT AVG(price)
FROM StockTradeIStreamChannel [ROWS 3]

タプルはイベントであるため、ROWS 3操作は、最初のイベントが到着したときにリレーション内の3つのイベントの価格を平均化することを意味します。この場合、リレーション内に入った最初のイベントに対して平均操作が実行されます。2番目のイベントがリレーション内に入ると、2つのイベントに対して平均操作が実行されます。3番目のイベントがリレーション内に入ると、3つのイベントに対して平均操作が実行されます。4番目のイベントがリレーションに入るまで平均化が再度行われることはありません。4番目のイベントがリレーション内に入ると、2番目、3番目および4番目のイベントが平均化されます。同様に、5番目のイベントがリレーション内に入ると、3番目、4番目および5番目のイベントが平均化されます。

前述の例では、すべての株式の価格が平均化されています。ストリーム内の特定の株式の平均を計算するために、次の問合せではパーティション化されたウィンドウが使用されています。

SELECT AVG(price), tickerSymbol
FROM StockTradeIStreamChannel [PARTITION by tickerSymbol ROWS 3]
GROUP BY tickerSymbol

パーティション化されたウィンドウにより、パーティションごとに個別のリレーション・ウィンドウが作成されます。このため、この例ではPARTITION by tickerSymbol句を使用して、同じティッカ・シンボルの株式が3つのイベントによってグループ化されて平均化されています。パーティションなしでGROUP BY句のみを使用する場合、タプルによって最後の3つのイベントが予想どおりに保持されますが、タプル内のティッカ・シンボルが常に一致するとはかぎらず、その場合は平均化エラーが発生します。

この問合せの構成ファイル・エントリは次のとおりです。ISTREAMは、リレーションからストリームへの演算子で説明されているリレーションからストリームへの演算子です。

<procesor>
<rules>
<query id="Example"><![CDATA[ISTREAM select tickerSymbol, AVG(price)
from StockTradeIStream
[PARTITION by tickerSymbol ROWS 3]
GROUP BY tickerSymbol) >
</query>
</rules>
</processor>

6.3.2.2 リレーションからストリームへの演算子

リレーションからストリームへの演算子は、ISTREAM、DSTREAMおよびRSTREAMです。

ISTREAM演算子

ISTREAM演算子は、挿入イベントをリレーションから出力ストリームに配置します。リレーション内で削除または更新されたイベントは無視されます。平均が変更されると、問合せによりdeleteイベントがリレーションに送信されて前の平均が削除され、insertイベントがリレーションに送信されて新しい平均がリレーションに追加されます。次の例では、ISTREAM演算子を使用して、新しい平均の計算時に出力ストリームが更新されます。

ISTREAM (SELECT AVG(price)
FROM StockTradeIStreamChannel [RANGE 1 MINUTE])

次の構成ファイル・エントリは、ISTREAM演算子を示します。

<processor>
<rules>
<query id=rule2 <![CDATA[ISTREAM (SELECT AVG(price)
FROM StockTradeIStreamChannel [RANGE 1 MIN >
</query>
</rules>
</processor>

DSTREAM演算子

DSTREAM演算子を使用すると、株式が交換のリストから外された場合など、有効ではなくなった状況を検出できます。次の例では、DSTREAM演算子を使用して、リレーション内の新しい平均の計算後に古い平均を持つ出力ストリームが更新されます。

DSTREAM (SELECT AVG(price)
FROM StockTradeIStreamChannel [RANGE 1 MINUTE])

次の構成ファイル・エントリは、DSTREAM演算子を示します。

<processor>
<rules>
<query id=rule2 <![CDATA[DSTREAM (SELECT AVG(price)
FROM StockTradeIStreamChannel [RANGE 1 MIN >
</query>
</rules>
</processor>

RSTREAM演算子

RSTREAM演算子は、イベントが削除または更新されたかどうかに関係なく、すべてのイベントを出力ストリームに挿入します。この演算子は、すべての出力に対してダウンストリーム・アクションを実行する必要がある場合に使用します。次の例では、RSTREAM演算子を使用して、入力ストリーム内のすべてのイベントを選択し、2つのイベントがリレーションに到着するのを待機し、2つのイベントをリレーションから出力ストリームに配置します。

RSTREAM (SELECT *
FROM StockTradeIStreamChannel [ROWS 2])

次の構成ファイル・エントリは、RSTREAM演算子を示します。

<processor>
<rules>
<query id=rule2 <![CDATA[RSTREAM (SELECT *
FROM StockTradeIStreamChannel [ROWS 2 >
</query>
</rules>
</processor>

6.3.2.3 NOWウィンドウおよび最終イベント・ウィンドウ

NOWウィンドウには、システムの最後のティックで発生したイベントが含まれます。NOW演算子を使用すると、最後の入力イベントが次回のタイム・ティック(新しいNOW)で削除される場合があるため、目的の結果が得られない可能性があります。実際に最後の入力イベントが必要な場合は、最終イベント・ウィンドウを使用してください。次の例は、NOWウィンドウを構築する方法を示します。

SELECT * FROM StockTradeIStream[NOW]

次の構成ファイル・エントリは、NOW演算子を示します。

<processor>
<rules>
<query id=rule2 <![CDATA[ISTREAM (SELECT *
FROM StockTradeIStreamChannel [NOW>
</query>
</rules>
</processor>

最終イベント・ウィンドウでは、受信した最終イベントが捕捉されます。次の例は、最終イベント・ウィンドウを構築する方法を示します。

SELECT * FROM StockTradeIStream[ROWS 1]

次の構成ファイル・エントリは最終イベント・ウィンドウを示します。

<processor>
<rules>
<query id=rule2 <![CDATA[ISTREAM (SELECT *
FROM StockTradeIStreamChannel [ROWS 1 >
</query>
</rules>
</processor>

6.3.3 プロセッサ出力制御(スライド)

問合せ結果を発生するたびに出力するかわりに、サブ句でSLIDE演算子を使用して出力イベントをバッチ処理できます。イベントは、ROW演算子を使用する場合はイベントの数に基づいてバッチ処理でき、RANGE演算子を使用する場合は時間の長さ(時間ウィンドウ)に基づいてバッチ処理できます。

注:

スライド値が指定されていない場合、問合せでは、タプルベースのウィンドウの場合はデフォルト値の1、時間ベースのウィンドウの場合は1タイム・ティックが想定されます。

イベント数別のバッチ処理

次の例では、2イベントごと(2、4、6、8、...)に出力しています。

SELECT * FROM StockTradeIStreamChannel[ROWS 3 SLIDE 2]

SLIDE演算子からの出力には、削除されたイベントが含まれます。最初の2つのイベントがリレーションに到着すると、問合せにより両方のイベントがストリームに出力されます。次のイベントが到着すると、リレーション内には3つのイベントが存在しますが、出力が次に行われるのは4番目のイベントのときです。4番目のイベントが到着すると、最初のイベントが削除され、3番目と4番目のイベントとともに出力が行われます。

次の例は、RSTREAM演算子とともにスライドを使用する方法を示します。この場合、4番目のイベントが到着すると、イベント2、3および4が出力ストリームに送信されます。RSTREAM演算子は、イベントが削除または更新されたかどうかとは関係なく、すべてのイベントを出力ストリームに送信します。

RSTREAM(SELECT * FROM StockTradeIStreamChannel[ROWS 3 SLIDE 2])

次の構成ファイル・エントリは、RSTREAMを使用して数別にバッチ処理しています。

<processor>
<rules>
<query id=rule2 <![CDATA[RSTREAM (SELECT *
FROM StockTradeIStreamChannel [ROWS 3 SLIDE 2 >
</query>
</rules>
</processor>

時間ウィンドウ別のバッチ処理

時間ウィンドウの場合、時間間隔(RANGE演算子)別にイベントがOracle Stream Analyticsによってバッチ処理されます。時間間隔を指定すると、Oracle CQLにより指定した数の倍数ごとにイベントがまとめて出力ストリームに送信されます。たとえば、5秒を指定すると、イベントは5、10、15、20、...秒ごとに送信されます。最初のイベントがこの間隔内で1、2または3秒に到着した場合、最初の出力は他の出力より小さくなります。

次の例では、5分間の範囲を30秒ごとのスライドを使用して指定しています。

SELECT * FROM StockTradeIStream[RANGE 5 MIN SLIDE 30 SECONDS]

次の構成ファイル・エントリは、時間ベースのスライドを示しています。

<processor>
<rules>
<query id=rule2 <![CDATA[RSTREAM (SELECT *
FROM StockTradeIStreamChannel [RANGE 5 MIN 30 SECONDS >
</query>
</rules>
</processor>

6.3.4 ビュー

ビューを使用すると、他のOracle CQL問合せで再使用できるOracle CQL文を作成できます。view要素には、Oracle CQLのサブ問合せ文が含まれます。view要素のid属性はビュー名を定義します。view要素で作成した最上位のSELECT文はビューと呼ばれます。

注:

サブ問合せは、UNION、UNION ALLおよびMINUSなどのバイナリ・セット演算子とともに使用されます。サブ問合せでは、問合せに正しい優先順位が適用されるようカッコを使用する必要があります。

次の例は、ビューv1、およびビューに対する問合せq1を示します。このビューは、xmltypeストリーム要素を持つストリームS1から選択します。ビューv1は、XMLTABLE句でXPath式を使用して、xmltypeストリーム要素のデータを解析します。問合せq1は他の任意のデータ・ソースの場合と同様に、ビューv1から選択します。XMLTABLE句はXMLネームスペースもサポートしています。

xmltypeストリームにはXMLデータが含まれます。Oracle CQLのXMLTABLE句を使用すると、XPath式を使用してxmltypeストリームのデータを列に解析し、列名でデータにアクセスできます。XPath式を使用すると、XMLドキュメント内の要素および属性間をナビゲートできます。

注:

ビューのスキーマのデータ型は、COLUMNS句で解析されたデータのデータ型と一致します。

<view id="v1" schema="orderId LastShares LastPrice"><![CDATA[
SELECT
X.OrderId,
X.LastShares,
X.LastPrice
FROM S1, XMLTABLE (
"FILL"
PASSING BY VALUE
S1.c1 as "."
COLUMNS
OrderId char(16) PATH "fn:data(../@ID)",
LastShares integer PATH "fn:data(@LastShares)",
LastPrice float PATH "fn:data(@LastPx)"
) as X
></view>

<query id="q1"><![CDATA[
IStream(
select
orderId,
sum(LastShares * LastPrice),
sum(LastShares * LastPrice) / sum(LastShares)
from
v1[now]
group by orderId
)
></query>

6.4 CQL集計

Oracle CQLは、増分形式計算用のAVG、COUNT、SUMなどの集計関数、および増分形式計算には関連しないMAXおよびMINをサポートしています。

集計関数によってイベントがJavaコレクションに集計されるため、コレクションAPIを使用してイベントを操作できます。

集計された結果に関する条件を確認するには、HAVING句を使用します。次の例では、50を超える平均のみが出力されます。

SELECT AVG(price) FROM StockTradeIStreamChannel [RANGE 1 HOUR]
HAVING AVG(price) > 50

Oracle CQLには、Coltオープン・ソース・ライブラリに基づいた、高性能な科学技術計算のための様々な組込みの単一行関数および集計関数が用意されています。Coltライブラリの一部として使用可能な関数は、Big Decimalデータ型またはNULL入力値はサポートしません。また、関数の値計算は増分形式ではありません。詳細は、COLTのWebサイトを参照してください。

6.5 表ソースの構成

関連付けられたデータ・ソースを使用して表コンポーネントを作成することにより、Oracle CQL問合せからリレーショナル・データベース表にアクセスできます。Oracle Stream Analyticsのリレーション・データベース表イベント・ソースはプル・データ・ソースです。つまり、Oracle Stream Analyticsにより、イベント・ソースが定期的にポーリングされます。

- NOWウィンドウのあるストリームのみを、単一のデータベース表にのみ結合できます。
表ソースの変更とストリーム・データはすぐには連係されないため、表ソースはNowウィンドウを使用してイベント・ストリームにのみ結合でき、また単一のデータベース表にのみ結合できます。

- Oracle JDBCデータ・カートリッジを使用して、任意の複雑なSQL問合せおよび複数の表とデータソースをOracle CQL問合せに統合できます。『Oracle CQLデータ・カートリッジによるアプリケーションの開発』のOracle JDBCデータ・カートリッジに関する項を参照してください。

注:

Oracle CQL文からリレーショナル・データベース表にアクセスするにはOracle JDBCデータ・カートリッジを使用することをお薦めします。

Oracle Stream Analyticsの管理のデータ・ソースの定義に関する項で説明されているように、NOWウィンドウを使用するかデータ・カートリッジを使用するかにかかわらず、Oracle Stream Analyticsサーバー・ファイルにデータ・ソースを定義する必要があります。

6.5.1 アセンブリ・ファイル

次のアセンブリ・ファイル・エントリは、id属性がStockである表ソースの設定を示します。

<wlevs:table id="Stock" event-type="TradeEvent" data-source="StockDataSource"/>

Oracle Stream Analyticsでは、イベント・タイプおよびデータ・ソースを使用して、リレーショナル表の行をイベント・タイプにマップします。TradeEventイベント・タイプは、リレーショナル・データベース内の列にマップされる5つのプライベート・フィールド(symbol、price、lastPrice、percChangeおよびvolume)があるJavaクラスから作成されます。

注:

XMLTYPEプロパティは表ソースに対してサポートされていません。

6.5.2 構成ファイル

<data-source>
<name>StockDs</name>
<connection-pool-params>
<initial-capacity>1</initial-capacity>
<max-capacity>10</max-capacity>
</connection-pool-params>
<driver-params>
<url>jdbc:derby:</url>
<driver-name>org.apache.derby.jdbc.EmbeddedDriver</driver-name>
<properties>
<element>
<name>databaseName</name>
<value>db</value>
</element>
<element>
<name>create</name>
<value>true</value>
</element>
</properties>
</driver-params>
<data-source-params>
<jndi-names>
<element>StockDs</element>
</jndi-names>
<global-transactions-protocol>None</global-transactions-protocol>
</data-source-params>
</data-source>

構成後、別のイベント・ストリームであるかのようにStock表にアクセスするOracle CQL問合せを定義できます。

次の例では、問合せはStockTradeIStreamChannelイベント・ストリームをStock表と結合しています。

SELECT StockTradeIStreamChannel.symbol, StockTradeIStreamChannel.price,
StockTradeIStream.lastPrice, StockTradeIStream.percChange,
StockTradeIStream.volume, Stock
FROM   StockTraceIStreamChannel [Now], Stock
WHERE  StockTradeIStreamChannel.symbol = Stock.symbol

表ソースの変更とストリーム・データはすぐには連係されないため、表ソースはNowウィンドウを使用してイベント・ストリームにのみ結合でき、また単一のデータベース表にのみ結合できます。

6.6 パラレル問合せ実行用のOracle CQLプロセッサの構成

パフォーマンス向上のため、CQL問合せを、デフォルトで行われているシリアル実行ではなく、パラレル実行できるようにすることが可能です。

CQLコードがこれをサポートしている場合、CQLプロセッサで複数のスレッドが使用可能なときは、着信イベントをパラレルに実行するように問合せを構成できます。

問合せ出力イベントの相対的な順序が問合せのダウンストリーム・クライアントにとって重要ではない場合のみ、パラレル問合せ実行を有効にします。たとえば、トランザクション・シーケンスが無関係な、特定の会社に関係する一連の株式取引を顧客に伝えるなど、問合せの主な目的がイベントのフィルタ処理である場合、イベントの順序付けは重要ではないと考えられます。

デフォルト(パラレル実行を有効にしない)では、問合せはチャネルからイベントをシリアルに処理します。システム・タイムスタンプを使用するチャネルを経由してルーティングされるイベントの場合、イベント順序は、イベントが受信される順序です。アプリケーションによってタイムスタンプが付加されるチャネルを経由する場合、イベント順序は、イベントに含まれるタイムスタンプの値によって決定された順序です。全体順序の制約を緩和すると、構成された問合せは、可能な場合はイベントをパラレルに処理しながら、その問合せのイベント順序を考慮しないようにできます。

6.6.1 パラレル問合せ実行のサポートの設定

パラレル問合せ実行のサポートの指定が主に単純な構成タスクである場合は、機能を最大限に活用できるように、次の手順に必ず従ってください。

- パラレル実行をサポートするように、ordering-constraint属性を使用します。

- プロセッサに呼び出すスレッドが、パフォーマンスの目標を達成するのに十分であることを確認します。パラレル問合せ実行の最大量は、CQLプロセッサで使用できるスレッドの数によって制約されます。たとえば、プロセッサのアダプタ・アップストリームが必要なスレッドの数をサポートし、アダプタとプロセッサの間にチャネルがある場合、パススルーとして機能するように、max-threadsの数を0にしてチャネルを構成してください。
パススルーを行わない場合、必ずmax-threadsの値を1より大きくして、問合せのアップストリーム・チャネルを構成してください。(max-threadsの値の設定を有用にするには、max-size属性を0より大きい値に設定する必要もあります。)詳細は、チャネルを参照してください。

- max-threads属性値の設定に関連するその他のガイドラインに従います。たとえば、max-threadsの値の設定を有用にするには、max-size属性を0より大きい値に設定する必要もあります。

- 必要に応じて、同期化されたブロックの使用などによって、問合せ結果を受け取るBeanがスレッドを認識していることを確認します。たとえば、Beanのコードによって、複数のスレッドで実行された問合せから受け取った結果のリストを作成する場合に、これを行う必要がある可能性があります。

6.6.2 ordering-constraint属性

イベントがシリアルに処理されることを保証する、デフォルトの順序付けの制約を緩和することで、パラレル問合せ実行を有効にします。これを行うには、queryまたはview要素でordering-constraint属性を設定します。

次の例では、可能であれば常に、問合せをパラレルに実行するように、ordering-constraint属性をUNORDEREDに設定します。

<query id="myquery" ordering-constraint="UNORDERED">
SELECT symbol FROM S WHERE price > 10
</query>

ordering-constraint属性は、次の3つの値をサポートします。

- ORDEREDは、出力イベントの順序は(入力イベントの順序で暗示されるように)重要であることを意味します。CQLエンジンはイベントをシリアルに処理します。これはデフォルトの動作です。

- UNORDEREDは、出力イベントの順序は出力イベントのコンシューマにとって重要ではないことを意味します。これにより、CQLプロセッサはイベントを複数のスレッドでパラレルに処理できるようになります。可能な場合、問合せは複数のスレッドでパラレルに実行して、イベントを処理します。

- PARTITION_ORDEREDは、異なるパーティション間の出力イベントの順序が出力イベントのコンシューマにとって重要ではない場合に、パーティション内の出力イベントの順序が(入力イベントの順序で暗示されるように)保持されるよう指定していることを意味します。このような緩和により、CQLエンジンは、パーティション間のイベントを複数のスレッドでパラレルに(可能な場合)処理できるようになります。

指定したパーティションに従っているイベントをシリアルに処理するが、パーティション間の順序は無視し、異なるパーティションに属するイベントをパラレルに処理するよう指定する場合に、Use the PARTITION_ORDEREDの値を使用します。PARTITION_ORDEREDの値を使用する場合、partition-expression属性を追加して、パーティション化用のどの式をパーティション間の順序付けの制約を緩和するための基準とするかも指定する必要があります。

次の例では、GROUP BY句はsymbolの値に基づいて出力をパーティション化します。partition-expression属性は、特定のsymbolの値に対応するイベントの指定されたサブセット内のイベントをシリアルに処理するよう指定します。一方、パーティション間では順序を無視できます。

<query id="myquery" ordering-constraint="PARTITION_ORDERED"
partitioning-expression="symbol">
SELECT
COUNT(*) as c, symbol
FROM
S[RANGE 1 minute]
GROUP BY
symbol
</query>

6.6.3 問合せのパーティション化でのpartition-order-capacityの使用

一般的に、より多くのスレッドを使用可能にして、可能な場合はパラレルで実行できるようにordering-constraint属性を設定することによって、問合せのパフォーマンスが向上すると考えられます。多くのパフォーマンス・チューニング技術と同様、これらの設定で少しずつ試行錯誤を重ねて、より良い結果となる組合せを見つける必要があります。

しかし、問合せでパーティション化を使用し、ordering-constraint属性をPARTITION_ORDEREDに設定した場合でも、期待するスケーリングの量にならない可能性があります。たとえば、4つのスレッドで実行しても2つのスレッドで実行する場合に比べてパフォーマンスがあまり向上しない場合を考えます。このような場合、パーティションを含む問合せの操作でCQLエンジンの特性を最大限に活用するために、partition-order-capacityの値を使用できます。

partition-order-capacityの値は、PARTITION_ORDEREDの問合せを処理する際に指定したプロセッサ・インスタンス内で許可されている並列の最大量を指定します。使用可能なスレッドが異なるパーティションに属するイベントを処理している場合、値は問合せ内で同時に実行できるスレッドの最大数を設定します。

他のパフォーマンス・チューニングの側面と同様、partition-order-capacityを最大限に活用するために、少し実験を行うことがあります。partition-order-capacityを調整する場合、最初に行うこととして適切なのは、CQLプロセッサ・インスタンスでアクティブにするスレッドの最大数にそれを設定することです。場合によっては(たとえば、データが高速である、CQLプロセッサからダウンストリームを処理することが困難など)、partition-order-capacityの値を使用可能なスレッド数より大きく設定しても、有用なことがあります。ただし、パフォーマンス・テストが指定したアプリケーションおよび負荷にとって有用であることを確認する場合、これのみを行う必要があります。

partition-order-capacityの値は4つの場所のうち1つから設定され、2つはユーザーが明示的に設定しない場合のフォールバックとなります。

次に、優先順位を示します。

1. チャネル構成に設定されたpartition-order-capacity要素。プロセッサの入力チャネルでこれを指定した場合、そのプロセッサのPARTITION_ORDERED問合せに対して有効になります。

2. サーバー構成に設定されたpartition-order-capacityプロパティ。チャネルに値が設定されない場合、サーバー上で実行中のすべてのPARTITION_ORDERED問合せに対してこの値が使用されます。

3. チャネル構成に設定されたmax-threadsの値。プロセッサの入力チャネルでこれを指定した場合、そのプロセッサのPARTITION_ORDERED問合せに対して有効になります。

4. partition-order-capacityの値とmax-threadsの値のいずれも指定しない場合、またはmax-threadsの値を0に設定した(つまりパススルー・チャネルである)場合に、システムのデフォルト値(現在は4に設定)が使用されます。

partition-order-capacityを使用する場合は、次の点に留意してください。

- partition-order-capacityの値は、ordering-constraint属性をPARTITION_ORDEREDに設定している場合のみ有用になります。

- partition-order-capacityを増やすと、通常、並列度およびスケーリングが増加します。たとえば、プロファイリングにロック競合のボトルネックが発生した場合、partition-order-capacityを増やして競合が減少しているかどうかを確認することが有用である可能性があります。

- パーティション化をCQLプロセッサで行う特定の方法により、partition-order-capacityを使用可能なスレッド数より大きく設定しても、場合によっては有用なことがあります。

- 非常に高い値を指定すると、使用するメモリーでリソース・コストがかかります。

- このパラメータの調整は、アプリケーションおよび入力率の詳細に大きく依存します。実験によって調整することは、最適な値を決定するのに必要な場合があります。

6.6.4 制限事項

可能であれば常にCQLプロセッサによって使用できるように、サポートを指定するパフォーマンス強化機能として、パラレル問合せ実行を検討してください。すべての問合せをパラレルで実行できるわけではありません。これには、特定のCQL言語機能を使用した問合せが含まれています。

たとえば、問合せで集計のフォーム(値の範囲から最大値を検索するなど)を使用する場合、CQLプロセッサは問合せを完全にはパラレルで実行できない可能性があります(これには、順序付けの制約を考慮して正しい結果を保証する必要があります)。一部の問合せのセマンティクスがそれ自体でも順序付け処理への問合せを制限しています。パラレル実行のサポートを指定しているかどうかに関係なく、このような問合せはシリアルで実行されます。

また、IStream、RStreamおよびDStream演算子は、処理のためにそのオペランドの状態を維持し、問合せを実行するために、CQLプロセッサがスレッドを同期化する必要があるようにします。

CQLプロセッサは、常に問合せのセマンティク目的に配慮していることに注意してください。ordering-constraint属性によってこの目的を変更する場合、この属性は目的を元のままに残す値に強制変換されます。

partitioning-expression属性を使用している場合、この属性は単一の式のみをサポートしていることに留意してください。値への複数のプロパティ名の入力はサポートされていません。

6.7 フォルト処理

固有のフォルト処理メカニズムを持たないコードで発生するフォルトを処理するコードを書き込むことができます。これには、Oracle CQLコードおよびマルチスレッドEPNチャネルが含まれます。

デフォルトでは、try/catch構造を使用するJavaと同様に、CQL言語には発生するエラーを処理するメカニズムがありません。CQLで発生するフォルトを処理するには、フォルト・ハンドラを書き込み、ハンドラをOracle CQLプロセッサなどのフォルトを処理するEPNステージに接続します。

フォルト・ハンドラとマルチスレッド・チャネル(つまり、max-threads設定が0より大きいチャネル)を関連付けることもできます。これにより、チャネルのダウンストリームであるステージからチャネルにスローされる例外が発生した場合のフォルト処理が提供されます。max-threads設定が0であるチャネルはアップストリーム・ステージに例外をすでに再スローしているパススルー・チャネルであることに注意してください。チャネルのフォルト・ハンドラに固有の追加情報は、フォルト処理を参照してください。

フォルト・ハンドラは、com.bea.wlevs.ede.api.FaultHandlerインタフェースを実装するJavaクラスです。OSGiサービスとしてフォルト・ハンドラを登録してステージに関連付けることによって、クラスをEPNステージに接続します。OSGiの詳細は、Springフレームワークを参照してください。

カスタム・フォルト・ハンドラを使用しない場合、次のデフォルトのフォルト処理動作を取得します。

- 例外がOracle CQLで発生する場合、CQLエンジンは例外を捕捉し、問合せプロセッサを停止します。

- プロセッサのダウンストリームであるステージで例外が発生する場合、そのステージはリスナーとして削除されます。

- 例外がログに記録され(CQLServerカテゴリの下)、例外句の一部であるイベントが破棄されます。

- アップストリーム・ステージは障害が通知されません。

書き込むカスタム・フォルト・ハンドラを使用する場合、次の操作を実行できます。

- ステージのフォルトをハンドラに例外としてスローするよう、フォルト・ハンドラとOracle CQLプロセッサまたはマルチスレッド・チャネルを関連付けます。そのため、例外を処理または再スローできます。

- コードで例外を処理するか、次のアップストリームのステージに再スローする場合、問合せ処理を続行できます。

- フォルトを処理する場合にイベント・データの損失を防ぎます。たとえば、データ・ソースへの接続を構成した場合、そこでイベント・データを保存できます。

- フォルトが発生した場合にフォルトおよびイベント情報をログに記録します。

- アップストリームでスローされた例外が他のOracle CQLプロセッサおよびチャネルに到達する場合にこれらが処理されるよう、EPNで必要な場合に複数のフォルト・ハンドラを使用します。

Oracle CQLプロセッサおよびマルチスレッド・チャネルを含むフォルトに対応する固有のメカニズムがないステージにフォルト・ハンドラを関連付けることを検討してください。固有の例外処理モデルを持つカスタム・アダプタなどの他のステージには、フォルト・ハンドラの利点がありません。

Oracle CQLプロセッサのアップストリームにあるステージへのフォルトの再スローを含む、実行するアクションを決定するためにフォルト処理コードでフォルトが評価される場合、問合せを続行できます。

たとえば、Oracle CQLプロセッサのアップストリーム・ステージは、JMSトランザクションをロールバックして(セッションがトランザクションである場合)イベントを再送信できるJMSサブスクライバ・アダプタである可能性があります。イベントがすでに再送信され、問題を解決できないことがわかった場合、トランザクションをコミットすることもできます。

カスタム・フォルト・ハンドラを使用する場合、問合せが停止して再起動したかのように、問合せ状態がフォルトの後にリセットされます。対照的に、デフォルトの動作の場合は、問合せが停止し、すべての後続のイベントが削除されます。

6.7.1 フォルト・ハンドラ・クラスの実装

com.bea.wlevs.ede.api.FaultHandlerインタフェースを実装して、フォルト・ハンドラ・クラスを作成します。クラスを書き込んだ後、OSGiサービスとして登録してフォルトを処理するステージと関連付けます。詳細は、フォルト・ハンドラの登録を参照してください。

handleFaultメソッドの実装は、ハンドラを関連付けるEPNステージの例外を受信します。例外自体は、com.bea.wlevs.ede.api.EventProcessingExceptionのインスタンスまたはJVMエラーが発生した場合のjava.lang.Errorのインスタンスです。

このメソッドは、コードで再スローする場合に例外が通過するアップストリーム・ステージの名前(捕捉コード)を含む文字配列も受信します。配列に複数の捕捉コードがある場合、再スローされた例外はそれらすべてを通過します。捕捉コードの配列が空になる場合は、一時的な問合せの実行中に例外が発生する場合と例外がチャネルのフォルト・ハンドラにスローされる場合の2つがあります。これらの場合、フォルト・ハンドラはバックグラウンド・スレッドのコンテキストで実行され、アップストリーム・ステージとのリンクはありません。

フォルト・ハンドラから再スローされる例外は、捕捉されるか、または捕捉できないステージ(関連付けられたフォルト・ハンドラがないプロセッサまたはマルチスレッド・チャネルなど)に到達するまで、アップストリームEPNステージ内を移動します。例外を再スローする場合、捕捉コード・リスト内のチャネルは例外を捕捉するために関連付けられたフォルト・ハンドラを持つ必要があるので注意してください。

EventProcessingExceptionインスタンスは、このクラスを拡張する例外タイプの1つ(CQLExecutionException、ArithmeticExecutionExceptionおよびその他を含む)でもある場合があります。Oracle Stream Analytics Java APIリファレンスを参照してください。EventProcessingExceptionインスタンスは、コードでフォルトの生成に含まれたイベントの挿入、削除および更新を取得できるメソッドを提供します。

メソッドの実装は、次のいずれかを実行する必要があります。

- Javaのtryおよびcatch文のようにフォルトを使用します。実装でフォルトを再スローしない場合、イベント処理は後続のイベントを続行します。ただし、問合せを再起動したかのように、問合せ処理は状態をリセットして続行します。処理状態が失われ、フォルトを発生させたイベントの後のイベントから処理を新たに開始します。

- アップストリーム・ステージ(またはフォルト・ハンドラ)で受信されるよう、フォルトを再スローします。フォルトを使用する場合のように、問合せ状態が後続のイベントでリセットされますが、問合せはイベントの処理を続行します。フォルトを受信するアップストリーム・ステージには、CQLプロセッサのMBeanインタフェースを使用して、問題のある問合せを明示的に停止するオプションが常にあります。

注:

MBeanでOracle CQL問合せを更新する場合、更新手順中はイベントを送信しないでください。いくつかの問合せの最中にイベントを送信した場合、出力ストリーム中のイベントの順序は保証されません。たとえば、Oracle CQLのパラレル実行でOracle CQL問合せを順序付けなしから順序付けありに更新する場合です。

次の例では、コードでフォルトを処理する上位レベルの説明を示します。

package com.example.faulthandler;

import com.bea.wlevs.ede.api.FaultHandler;

public class SimpleFaultHandler implements FaultHandler
{
private String suppress;

// Called by the server to pass in fault information.
@Override
public void handleFault(Throwable fault, String[] catchers) throws Throwable
{
// Log the fault.
return;
}
}

6.7.2 フォルト・ハンドラの登録

フォルト処理クラスを書き込んだ後、OSGiサービスとして登録して、EPNステージに関連付けることができます。これを実行する最も単純な方法は、EPNアセンブリ・ファイルで宣言的にハンドラを登録することです。

注:

固有のOSGi動作のため、構成からランタイム・フォルト・ハンドラ登録が非同期的に発生します。つまり、ハンドラがフォルトを受信する前に少しのウォームアップ時間が必要になる場合があります。ネットワークに届く最初のイベントに対してハンドラの準備が整っているようにするには、アプリケーションでイベントの受信を開始する前に待機期間を追加します。

次の例では、EPNアセンブリ・ファイルの引用は、idがexampleProcessorであるOracle CQLプロセッサのフォルト・ハンドラとしてSimpleFaultHandlerクラスを登録するservice要素節を示します。

<osgi:service interface="com.bea.wlevs.ede.api.FaultHandler">
<osgi:service-properties>
<entry key="application.identity" value="myapp"/>
<entry key="stage.identity" value="exampleProcessor"/>
</osgi:service-properties>
<bean class="com.example.faulthandler.SimpleFaultHandler"/>
</osgi:service>

<!-- A processor with a user-defined function. -->
<wlevs:processor id="exampleProcessor" >
...
</wlevs:processor>

OSGiサービスを登録するスキーマの詳細は、http://static.springsource.org/osgi/docs/1.1.x/reference/html/appendix-schema.htmlを参照してください。OSGiの詳細は、http://en.wikipedia.org/wiki/OSGiを参照してください。

7 イベントBean

Javaは、EPNに追加するイベントBeanコンポーネントおよびSpring Beanコンポーネント用のロジックを作成するために使用する言語です。イベントBeanは、EPN内でイベント・データ上で機能するアプリケーション・ロジックを定義するために使用します。Spring Beanは、EPN内で使用するデプロイメント・コンテキストおよび機能がSpringに基づいているときに使用します。

すべてのBeanアプリケーション・ロジックは、イベント・シンク、イベント・ソースまたはその両方として機能します。イベント・シンクは、大量のイベント・データを受信してこれらを処理します。イベント・ソースは、大量のイベント・データを送信します。EPNでは、ロジックを使用してイベントBeanおよびアダプタを構成することにより、これらがイベント・ソース、イベント・シンク、またはその両方として動作するようにできます。イベントBeanの場合、イベント・シンクおよびイベント・ソースのロジックは関連するJavaBeanから採用されます。アダプタの場合、イベント・シンクおよびイベント・ソースのロジックはJavaBeanイベント・タイプから採用されます。JavaBeanイベント・タイプの作成の詳細は、イベントおよびイベント・タイプを参照してください。

イベントBeanのロジックではJAXBを使用できます。詳細は、JAXBのサポートを参照してください。

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

- イベントBeanおよびSpring Bean

- イベント・シンクのインタフェース

- イベント・ソースのインタフェース

7.1 イベントBeanおよびSpring Bean

イベントBeanおよびSpring Beanは、Javaクラスに基づいています。イベントBeanおよびSpring Beanに使用するJavaクラスは、アプリケーション要件に応じてJavaBean仕様に準拠している場合としていない場合があります。

イベントBeanは、通常のSpringベースのBeanに対するOracle拡張機能です。

イベントBeanは、イベント・シンク、イベント・ソース、またはイベント・シンクとイベント・ソースの両方である場合があります。イベント・シンクおよびイベント・ソースはアダプタおよびイベントBeanに追加できます。

- イベント・シンクは、イベントをリスニングして処理するJavaBeanまたはJavaクラスです。イベント・シンクは、イベントを受信し、イベントからデータを取得し、データから新しいイベントを作成してダウンストリーム・コンポーネントに送信できます。

- イベント・ソースは、イベントを送信するJavaBeanまたはJavaクラスです。

使用するデプロイメント・コンテキストおよび機能がSpringに基づいている場合は、Spring Beanを使用します。それ以外の場合は、イベントBeanを使用します。表7-1にイベントBeanとSpring Beanの機能を示します。

表7-1 イベントBeanおよびSpring Beanの比較

Beanタイプ

説明

イベントBean

Oracle Stream Analyticsサーバー・コンテナの機能を積極的に使用するEPNステージとして役立ちます。イベントBeanの機能は次のとおりです。

- タイプはOracle Stream Analytics EPNステージです。

- Oracle Stream Analytics監視フレームワークによって監視できます。

- 構成メタデータの注釈を利用できます。

- 通過するイベントを記録および再生するよう設定できます。

- Oracle Stream AnalyticsサーバーAPIインタフェースを実装するのではなく、そのXML宣言にメソッドを指定することにより、Oracle Stream AnalyticsサーバーBeanライフサイクルをサポートできます。

Spring Bean

Springへのレガシー統合に役立ちます。Spring Beanの機能は次のとおりです。

- EPNに追加するSpring Beanがある場合に役立ちます。

- タイプはOracle Stream Analytics EPNステージではありません。

- Oracle Stream Analytics監視フレームワークによって監視することはできません。

- 構成メタデータの注釈を使用できません。

- 通過するイベントを記録および再生するよう設定できません。

7.1.1 スレッドの動作

イベントBeanは、RunnableまたはRunnableBeanインタフェースが実装されている場合、パラレルに実行されます。このインフラストラクチャでは、スレッドを生成するためのアプリケーションに関連付けられたワーク・マネージャが使用されます。

ワーク・マネージャをアプリケーションに関連付けるには、アプリケーションと同じ名前をワーク・マネージャに付けます。アプリケーションに対してワーク・マネージャを明示的に指定しない場合、Oracle Stream Analyticsでは、最小数(MIN)および最大数(MAX)のスレッドに対して、デフォルト値を使用してワーク・マネージャが作成されます。

スレッドをより詳細に制御する必要がある場合、カスタムイベントBeanを使用してcom.bea.wlevs.ede.spi.WorkManagerAwareインタフェースを実装できます。この場合、イベントBeanは初期化中にアプリケーションのワーク・マネージャを使用してインジェクトされます。ワーク・マネージャを使用すると、イベントBeanインスタンスのスレッドを明示的に管理できます。

7.1.2 ハートビート・イベントの受信

イベントBeanがハートビート・イベントを受信するようにするには、com.bea.wlevs.ede.api.HeartbeatAwareインタフェースを実装します。ハートビート・イベントは、時間の進行をモデリングするために使用できるheartbeatタイプのイベントです。このインタフェースには、実装対象としてonHeartbeat(long timestamp)コールバック・メソッドがあります。

7.1.3 イベントBeanの作成

イベントBeanは、通過するイベントにロジックを適用するEPNコンポーネントです。イベントBeanのロジックは、JavaBeanイベント・タイプによって定義されます。

この章では、いくつかのアセンブリおよび構成ファイルのイベントBean設定について説明します。すべてのリファレンスは、『Oracle Stream Analyticsスキーマ・リファレンス』のevent-beanに関する項を参照してください。

アセンブリ・ファイル

次のイベントBeanのアセンブリ・ファイル・エントリは、イベントBeanのid、関連するclass、およびイベントBeanがアップストリームBeanOutputChannelコンポーネントからイベントをリスニングすることを示します。

<wlevs:event-bean id="eventBean" class="tradereport.TradeEvent" >
<wlevs:listener ref="BeanOutputChannel"/>
<wlevs:event-bean>

構成ファイル

次のイベントBeanの構成ファイル・エントリは、record-parameters子要素を使用して構成されたイベントBeanを示します。

<event-bean>
<name>eventBean</name>
<record-parameters>
<dataset-name>tradereport_sample</dataset-name>
<event-type-list>
<event-type>TradeEvent</event-type>
</event-type-list>
<batch-size>1</batch-size>
<batch-time-out>10</batch-time-out>
</record-parameters>
</event-bean>

7.1.4 Spring Beanの作成

イベント処理ネットワークにクラスを含めるためにSpring BeanとしてJavaクラスを構成できます。これは、EPNに組み込む既存のSpring Beanがある場合、またはSpringの機能をJavaコードに組み込む場合の適切なオプションです。

EPNに追加するSpring Beanでは、様々なライフサイクル・インタフェースを実装できます。これらには、InitializingBean、DisposableBeanおよびRunnableBeanなどのアクティブなインタフェースが含まれます。Spring Beanイベント・ソースでは、@Prepare、@Rollback、@Activateなどの構成メタデータの注釈も利用できます。

Spring BeanはSpringフレームワークで管理されるJavaクラスです。標準のbean要素を使用してEPNアセンブリ・ファイルで構成して、Spring Beanとしてクラスを追加します。

Spring Beanは、Oracle Stream Analyticsステージではありません。Spring BeanはOracle Stream Analytics監視フレームワークによって監視できず、Spring Beanでは構成メタデータの注釈を使用できず、通過するイベントを記録および再生するようSpring Beanを設定することもできません。

アセンブリ・ファイル

アセンブリ・ファイルでは、bean要素を使用してカスタムSpring Beanをイベント・プロセッサ・ネットワークのコンポーネントとして宣言します。次に例を示します。

<bean id="TradeListenerBean"
class="com.oracle.cep.example.tradereport.TradeListener">
</bean>

7.2 イベント・シンクのインタフェース

イベント・シンクを作成することにより、EPN内でイベントを受信し、イベント・データに反応するロジックを適用します。イベント・シンクのJavaクラスは、この項に記載されているインタフェースのいずれかを実装します。

各インタフェースは、通常チャネルであるJavaクラスからEPNステージに接続されたアップストリームをイベントが終了する場合にイベントをクラスに渡すためにOracle Event Processingサーバーで使用するメソッドを提供します。

ここで示されるインタフェースは、ストリームまたはリレーションとして到着するイベントのサポートを提供します。ただし、リレーションのインタフェースは、ストリームとして到着するイベントの受信もサポートします。次の表に示すように、インタフェースは階層的に関連します。

インタフェース

説明

com.bea.wlevs.ede.api.StreamSink

イベントをストリームとして順番に受信するために実装します。

com.bea.wlevs.ede.api.RelationSink

イベントをリレーションとして順番に受信するために実装します。イベントをストリームとして受信するためにStreamSinkを拡張します。

com.bea.wlevs.ede.api.BatchStreamSink

バッチ処理されたイベントをストリームで受信するために実装します。アップストリーム・チャネルでバッチ処理が許可されている場合、イベントはタイムスタンプによってバッチ処理されて到着する場合があります。バッチ処理されていないイベントの受信をサポートするためにStreamSinkを拡張します。

com.bea.wlevs.ede.api.BatchRelationSink

バッチ処理されたイベントをリレーションとして受信するために実装します。アップストリーム・チャネルでバッチ処理が許可されている場合、イベントはタイムスタンプによってバッチ処理されて到着する場合があります。バッチ処理されていないイベントのストリームまたはリレーションとしての受信をサポートするためにRelationSinkを拡張します。

onInsertEvent実装でのEventRejectedExceptionの動作

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

7.2.1 StreamSinkの実装

ストリームとしてイベントを受信するクラスは、Oracle Stream Analyticsの観点からは、挿入されるイベントのみ受信します。そのため、ストリームでは、イベントは常にシーケンスの最後に追加されます。また、ストリームのイベントは、あるイベントから次のイベントに移る際にタイムスタンプの値が古くならないよう、常に時間の昇順で受信します。値が古くならないタイムスタンプを使用すると、あるイベントのタイムスタンプを、先行するイベントのタイムスタンプと同じかそれより大きな値にすることができます。タイムスタンプの値は同じかそれより新しくなります。

その結果、ストリームとしてのイベントの受信をサポートするインタフェースは、受信イベントごとに1つのメソッドを持ちます。リレーションとしてイベントを受信するインタフェースは、複数の種類のイベントの受信をサポートしています。

バッチ処理されていないイベントをストリームとして受信するクラスの場合、StreamSinkインタフェースを実装します。StreamSinkインタフェースには、クラスに接続されるアップストリーム・ステージをイベントが離れる場合にストリームから各イベントに渡すためにOracle Stream Analyticsサーバーが呼び出す1つのメソッドonInsertEventがあります。

例7-1では、株式取引イベントを受信する単純なStreamSink実装は、Objectインスタンスとして各イベントを受信し、イベントが特定のイベント・タイプのインスタンスかどうかをテストして確認します。そうである場合、コードはそのタイプのメンバーであるプロパティの値を取得します。

ストリームとしてバッチ処理されたイベントを受信するクラスの場合、BatchStreamSinkインタフェースを実装します。インタフェースには、アップストリーム・ステージから受信するイベントの集合に渡すためにOracle Stream Analyticsサーバーが呼び出す1つのメソッドonInsertEventsがあります。BatchStreamSinkインタフェースはStreamSinkを拡張するため、バッチ処理されていないイベントも受信できます。

イベントのバッチ処理の詳細は、バッチ処理チャネルを参照してください。

例7-1 StreamSinkインタフェースの実装

public class TradeListener implements StreamSink {

public void onInsertEvent(Object event) throws EventRejectedException {
if (event instanceof TradeEvent){
String symbolProp = ((TradeEvent) event).getSymbol();
Integer volumeProp = ((TradeEvent) event).getVolume();
// Code to do something with the property values.
}
}
}

7.2.2 RelationSinkの実装

リレーションとしてイベントを受信するクラスは、リレーションにある可能性があるすべての種類のイベント(挿入イベント、削除イベントおよび更新イベント)を受信できます。ストリームと異なり、リレーションのイベントは順序付けされず、リレーションを作成または操作したコードで更新または削除されたイベントを含みます。

そのため、リレーションとしてのイベントの受信をサポートするインタフェースには、クラスで挿入イベント、削除イベントまたは更新イベントを受信できるメソッドがあります。

バッチ処理されていないイベントをリレーションとして受信するクラスの場合、RelationSinkインタフェースを実装します。RelationSinkインタフェースには、onInsertEvent、onDeleteEventおよびonUpdateEventの3つのメソッドがあり、このうち1つはStreamSinkインタフェースから継承されたものです。実行時、Oracle Stream Analyticsサーバーは、クラスに接続されるアップストリーム・チャネルから受信するイベントのタイプに応じて適切なメソッドを呼び出します。

public class TradeListener implements RelationSink {

public void onInsertEvent(Object event) throws EventRejectedException {
if (event instanceof TradeEvent){
String symbolProp = ((TradeEvent) event).getSymbol();
Integer volumeProp = ((TradeEvent) event).getVolume();
// Do something with the inserted event.
}
}

@Override
public void onDeleteEvent(Object event) throws EventRejectedException {
if (event instanceof TradeEvent){
// Do something with the deleted event.
}
}

@Override
public void onUpdateEvent(Object event) throws EventRejectedException {
if (event instanceof TradeEvent){
// Do something with the updated event.
}
}
}

バッチ処理されたイベントをリレーションとして受信するクラスの場合、BatchRelationSinkインタフェースを実装します。java.util.Collectionインスタンスのバッチから3つのタイプすべてのイベントを受信するよう設計されたonEventsメソッドがあります。

onEvents(insertEvents, deleteEvents, updateEvents)

また、BatchRelationSinkインタフェースはRelationSinkインタフェースを拡張して、バッチ処理されていないイベントの受信をサポートします。

実行時、Oracle Stream Analyticsサーバーは、適切なメソッドを呼び出して、クラスに接続されたアップストリーム・ステージから受信するイベントに渡します。

イベントのバッチ処理の詳細は、バッチ処理チャネルを参照してください。

この項で説明しているOracle Stream Analytics APIの完全なAPIリファレンス情報は、Oracle Stream Analytics Java APIリファレンスを参照してください。

7.3 イベント・ソースのインタフェース

イベント処理ネットワークのダウンストリーム・ステージにイベントを送信するJavaクラスを作成できます。イベント・ソースなどを作成することにより、たとえば、JavaコードによってEPNを通過するイベント・データから作成または変更されたイベントを送信できます。

イベント・ソースのJavaクラスは、この項に記載されているインタフェースのいずれかを実装します。これらの各インタフェースは、Oracle Stream Analyticsサーバーで使用されるメソッドを提供して、クラスにセンダー・クラスのインスタンスを渡します。

イベント・ソースで受信するセンダー・インスタンスは、この項に記載されているセンダー・インタフェースのいずれかを実装します。センダー・インタフェースは、バッチ処理の有無にかかわらずストリームまたはリレーションとしてイベントをチャネルなどの後続のダウンストリームEPNステージに送信するためにコードで呼び出すことができるメソッドを提供します。

ここで示されるインタフェースは、ストリームまたはリレーションとしてのイベントの送信をサポートします。リレーションのインタフェースも、ストリームとしてのイベントの送信をサポートします。

表7-2 イベント・ソースを実装するインタフェース

インタフェース

説明

com.bea.wlevs.ede.api.StreamSource

ストリームとしてイベントを送信するためにこのインタフェースを実装します。実行時、Oracle Stream Analyticsサーバーはストリーム・センダー・クラスのインスタンスをインジェクトします。

com.bea.wlevs.ede.api.RelationSource

ストリームまたはリレーションとしてイベントを送信するためにこのインタフェースを実装します。実行時、Oracle Stream Analyticsサーバーはリレーション・センダー・クラスのインスタンスをインジェクトします。ストリーム・イベントもサポートするよう、StreamSourceを拡張します。

表7-3に示すインタフェースは、イベント・ソース・クラスがOracle Stream Analyticsサーバーから受信するセンダー・クラスによって実装されます。

表7-3 センダー・クラスで実装されるインタフェース

インタフェース

説明

com.bea.wlevs.ede.api.StreamSender

ストリームとしてイベントを送信するためのメソッドを提供します。

com.bea.wlevs.ede.api.RelationSender

リレーションとしてイベントを送信するためのメソッドを提供します。ストリーム・イベントもサポートするよう、StreamSenderを拡張します。

com.bea.wlevs.ede.api.BatchStreamSender

コードでストリームとしてバッチ処理されたイベントを送信できるメソッドを提供します。送信するダウンストリーム・ステージがバッチ処理されたイベントのために構成されたチャネルである場合、タイムスタンプでバッチ処理されたイベントを送信できます。バッチ処理されていないイベントを送信するサポートも提供するよう、StreamSenderを拡張します。

com.bea.wlevs.ede.api.BatchRelationSender

バッチ処理されたイベントをリレーションとして送信するためのメソッドを提供します。ダウンストリーム・ステージがバッチ処理されたイベントのために構成されたチャネルである場合、タイムスタンプでバッチ処理されたイベントを送信できます。バッチ処理されていないイベントをサポートするためにRelationSenderを拡張します。

7.3.1 StreamSenderの実装

ストリーム・イベントのソースであるクラスは、Oracle Stream Analyticsの観点からは、挿入されるイベントのみ送信します。挿入されたイベントのみ送信すると、リレーションではなくストリームがモデル化されます。ストリーム・ソースから送信されるイベントでは、あるイベントから後続のイベントに移る際にタイムスタンプの値が古くならないようにする必要があります。後続のイベントのタイムスタンプは、直前のイベントと同じか後である必要があります。

StreamSourceを実装する場合、コードによってバッチ処理の有無にかかわらずイベントを送信できます。StreamSource setEventSenderメソッドの実装により、表7-3に示されているタイプのいずれかにキャストできるセンダー・インスタンスを受信します。コードでセンダー・インスタンスを使用して、ダウンストリーム・ステージで期待されるとおりにイベントを送信します。

コードでバッチ処理を有効にするチャネルにイベントを送信する場合、送信する前にバッチ処理されたイベント・センダーのいずれかを使用して、タイムスタンプでイベントをバッチ処理します。詳細は、バッチ処理チャネルを参照してください。

センダー・インスタンスは、アプリケーションのタイムスタンプを付加するように受信チャネルを構成する場合にハートビートを送信するsendHeartbeatメソッドも提供します。

7.3.2 RelationSenderの実装

リレーションとしてイベントのソースであるクラスは、ダウンストリーム・ステージに挿入イベント、削除イベントおよび更新イベントを送信できます。RelationSourceインタフェースを実装する場合、コードでバッチ処理の有無にかかわらずイベントを送信できます。RelationSource setEventSenderメソッドの実装により、表7-3に示されているタイプのいずれかにキャストできるセンダー・インスタンスを受信します。センダー・インスタンスを使用して、イベントをダウンストリーム・ステージに送信します。

クラスで受信するセンダー・インスタンスの処理に関して次の制約に留意してください。

- sendDeleteEventについては、チャネル用に構成されたのと同じイベント・タイプのインスタンスを送信する必要があります。

- sendInsertEventについては、同じ主キーを持つイベントがすでにリレーション内に含まれる場合、一意制約違反例外が発生し、入力イベントが破棄されます。

- sendUpdateEventについては、指定の主キーを持つイベントがリレーション内に含まれていない場合、無効な更新タプル例外が発生し、入力イベントが破棄されます。

次の例では、単純なRelationSource実装はStreamSenderを受信し、リレーションとしてイベントを送信するためにセンダーをRelationSenderにキャストします。このクラスはリポジトリで構成されたイベント・タイプから新しいTradeEventインスタンスを作成しますが、sendEventsメソッドはコードの別の部分からパラメータと同じように簡単にインスタンスを受信できます。

package com.oracle.cep.example.tradereport;

import com.bea.wlevs.ede.api.EventType;
import com.bea.wlevs.ede.api.EventTypeRepository;
import com.bea.wlevs.ede.api.RelationSender;
import com.bea.wlevs.ede.api.RelationSource;
import com.bea.wlevs.ede.api.StreamSender;
import com.bea.wlevs.util.Service;

public class TradeEventSource implements RelationSource {

// Variables for event type respository and event sender. Both
// will be set by the server.
EventTypeRepository m_repos = null;
RelationSender m_sender = null;

// Called by the server to set the repository instance.
@Service
public void setEventTypeRepository(EventTypeRepository repos) {
m_repos = repos;
}

// Called by the server to set the sender instance.
@Override
public void setEventSender(StreamSender sender) {
// Cast the received StreamSender to a RelationSender
m_sender = (RelationSender)sender;
}

/**
* Sends events to the next EPN stage using the sender
* received from the server. This code assumes that an event
* instance isn't received from another part of the class,
* instead creating a new instance from the repository.
*/
private void sendEvents(){
EventType eventType = m_repos.getEventType("TradeEvent");
TradeEvent tradeEvent = (TradeEvent)eventType.createEvent();
m_sender.sendDeleteEvent(tradeEvent);
}
}

8 キャッシュ済イベント・データ

アプリケーションがイベント・データにアクセスできるようにキャッシング・システムを構成できます。Oracle Coherence分散キャッシング、Oracle Stream Analyticsローカル・キャッシングおよびサードパーティ提供のキャッシング・ソリューションを組み合せてシステムのキャッシュを構成できます。Oracle CQLおよびJavaクラスを使用してキャッシュのイベントにアクセスできます。

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

- キャッシングの定義

- Oracle Coherenceキャッシュ・システムおよびキャッシュの構成

- ローカル・キャッシング・システムおよびキャッシュの構成

- イベント・リスナーとしてのキャッシュの構成

- キーによるキャッシュのインデックス

- イベント・ソースとしてのキャッシュの構成

- キャッシュ・リスナーによるキャッシュの構成

- サードパーティのキャッシング・システムおよびキャッシュの構成

- キャッシュおよび他のデータ・ソース間のデータの交換

- アプリケーション・コードからキャッシュへのアクセス

8.1 キャッシングの定義

キャッシュはイベント・データの一時記憶域です。イベント・データの可用性およびアプリケーションのパフォーマンス向上のため、キャッシュを作成できます。アプリケーションでイベントを作成したキャッシュにパブリッシュ、または作成したキャッシュからイベントを使用できるようになります。

また、他のアプリケーションがキャッシュに書き込んだ処理済のイベント・データにもアクセスできます。

イベントを生成するOracle Stream Analyticsアプリケーションで任意のステージを構成し、イベントをキャッシュにパブリッシュできます。キャッシュはEPNのステージである必要はありません。キャッシングAPIを使用してプログラミングすることにより、別のコンポーネントまたはSpring Beanからキャッシュのイベントにアクセスできます。

キャッシング・システムとは、キャッシュ実装の構成されたインスタンスです。キャッシング・システムは、構成されたキャッシュの名前付きセットを定義するとともに、任意のキャッシュが複数のマシンに渡って配信される場合、リモート通信用の構成を定義します。

Oracle Stream Analyticsキャッシングにより、アプリケーションで次のタスクを実行できます。これらのタスクはすべてインクリメンタルに行われ、アプリケーションの停止や待機時間スパイクは発生しません。

- アプリケーションのデプロイ前にキャッシュにイベント・データをあらかじめロードします。

- キャッシュのイベント・データを定期的にリフレッシュ、無効化およびフラッシュします。

- 動的にキャッシュ構成を更新します。

8.1.1 サポート対象のキャッシュ実装

Oracle Stream Analyticsでは、次のキャッシュ実装がサポートされます。

- Oracle Stream Analyticsローカル・キャッシュ: ローカルのインメモリー・シングルJVMキャッシュ。この実装はローカルの使用に最適です(クラスタで使用できません)。設定が比較的簡単なため、早期の開発にも役立つ場合があります。

- Oracle Coherence: クラスタリングされたアプリケーションおよびアプリケーション・サーバーのJCacheに準拠したインメモリー分散型データ・グリッド・ソリューション。これは、クラスタ全体の同時実行性制御を使用してデータへの更新を連携動作させ、使用可能な最高性能のクラスタ化プロトコルを使用してデータ変更をクラスタ全体にレプリケートする他、データ変更通知をそれをリクエストするすべてのサーバーに配信します。ユーザーは、標準JavaコレクションAPIを使用してデータへのアクセスや変更を行うことでOracle Coherenceの機能を活用する他、JavaBeanの標準イベント・モデルを使用してデータ変更通知を受け取ります。

注:

Oracle Stream AnalyticsをOracle Coherenceと組み合せて使用するには、Coherence Enterprise Edition、Coherence Grid Edition、Oracle WebLogic Application Gridのライセンスなどの有効なOracle Coherenceライセンスを取得する必要があります。

Oracle Coherenceの詳細は、http://docs.oracle.com/middleware/1213/coherence/index.htmlを参照してください。

- サードパーティのキャッシュ: Oracle Stream Analyticsをサードパーティの他のキャッシュ実装で機能することを可能にするプラグインを作成できます。

8.1.2 ユース・ケース

高いスループットが特に重要になる可能性がある場合、キャッシュ技術はストリーミング・データのユース・ケースに非常に役立ちます。通常、キャッシュからのデータの取得は、リレーショナル・データベースからの同じデータの取得よりはるかに高速になります。

Oracle Stream Analyticsアプリケーションでキャッシュする共通のユース・ケースのシナリオは次のとおりです。

- キャッシュへのイベントのパブリッシュ
金融アプリケーションは、金融市場が開いている間はイベントをキャッシュにパブリッシュし、市場終了後にキャッシュのデータを処理します。イベントをキャッシュにパブリッシュすると、イベントがアプリケーションまたはサーバー上で稼働する他のOracle Stream Analyticsアプリケーションで使用可能になります。イベントをキャッシュにパブリッシュすると、キャッシュの実装によってセカンダリ・ストレージへの非同期的書込みも可能になります。

- キャッシュ内のデータの使用
Oracle Stream Analyticsアプリケーションでは、ストリーミング以外のデータへのアクセスが必要になる場合があります。このデータをキャッシュすることで、アプリケーションのパフォーマンスが向上します。プログラムによりキャッシュに直接アクセスできるOracle Stream Analyticsアプリケーションの標準のコンポーネントは、入力および出力アダプタ、およびビジネスPOJOです。

また、アプリケーションは、ユーザー定義関数またはOracle CQL文から直接のいずれの方法でも、Oracle CQLからキャッシュにアクセスできます。ユーザー定義関数の場合、プログラマはSpringを使用してキャッシュ・リソースを関数の実装に組み込みます。詳細は、アプリケーションおよびリソース構成を参照してください。

アプリケーションは、プロセッサで実行するOracle CQL文から直接キャッシュに問合せを実行することもできます。この場合、データがキャッシュから抽出される場合を除いて、キャッシュへの問合せがチャネルへの問合せに類似するように、キャッシュはプロセッサへの別の種類のデータ・ソースとして機能します。

キャッシュに問い合せるためにOracle CQLを使用する例は、注文や注文をキャッシュに実行するために使用される取引をパブリッシュする金融アプリケーションにみられます。市場が終了する1日の終わりに、アプリケーションはキャッシュへの問合せを実行し、特定の注文に関連するすべての取引を検索します。

- キャッシュのデータの更新と削除
Oracle Stream Analyticsアプリケーションでは、必要に応じてキャッシュ内のデータを更新および削除できます。たとえば、金融アプリケーションでは注文を実現する個々の取引が実行されるたびにキャッシュ内の注文を更新し、注文が取り消された場合はこれを削除する必要があります。キャッシュ内のデータの使用が許可されたアプリケーションのコンポーネントには、データの更新も許可されます。

- マルチサーバー・ドメインにおけるキャッシュの使用
キャッシュを使用するOracle Stream Analyticsアプリケーションを構築する場合、そのアプリケーションをマルチサーバー・ドメインでデプロイし、分散型キャッシュをサポートするキャッシング・システムを使用する必要があります。この場合、Oracle Coherenceまたは分散型キャッシュをサポートするサードパーティのキャッシング・システムのいずれかを使用する必要があります。

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

- Oracle Coherenceキャッシュ・システムおよびキャッシュの構成

- サードパーティのキャッシング・システムおよびキャッシュの構成

8.2 Oracle Coherenceキャッシュ・システムおよびキャッシュの構成

Oracle Coherenceキャッシング・システムおよびキャッシュを使用するようにアプリケーションを構成できます。アプリケーションをマルチサーバー・ドメインにデプロイしようとする場合は、このキャッシング・システムを使用します。

Oracle Coherenceを使用して構成すると、第1キャッシュ・システムのみがサーバー内に構成されます。Oracle Stream Analyticsサーバーは、構成済の他のキャッシング・システムを無視します。

注:

合法的にOracle CoherenceをOracle Stream Analyticsとともに使用するには、Coherence Enterprise Edition、Coherence Grid Edition、またはOracle WebLogic Application Gridのライセンスなどの有効なCoherenceライセンスを取得する必要があります。

Oracle Coherenceの詳細は、http://docs.oracle.com/middleware/1213/coherence/index.htmlを参照してください。

次のアセンブリおよび構成ファイル設定で、Oracle Coherenceキャッシング・システムおよびOracle CQLプロセッサのキャッシュが構成されます。このキャッシュは、イベント・タイプを使用してリレーショナル・データベースの表の行を特定するキー・プロパティを指定します。このキャッシング・システムは公開されており、他のアプリケーションからキャッシュのデータにアクセスできます。

8.2.1 アセンブリ・ファイル

アセンブリ・ファイル設定により、キャッシング・システムおよびcache1を構成します。value-type設定では、データベースの値をロードするイベント・タイプを指定します。このキャッシュは通知されます。

<wlevs:cache id="cache1" value-type="TradeReport" advertise="true">
<wlevs:caching-system ref="coherence-caching-system"/>
</wlevs:cache>
<wlevs:caching-system id="coherence-caching-system" provider="coherence"/>

注:

EPN図のcoherenceキャッシュのid設定を変更すると、アセンブリ・ファイルとcoherence-cache-ファイルのidが変更されます。ただし、アセンブリ・ファイルのソース・エディタでid設定を変更すると、アセンブリ・ファイルのidのみが変更されます。この場合は、coherence-cache-のcache-name設定を、アセンブリ・ファイルのid設定と一致するように手動で変更する必要があります。また、そのキャッシュへのすべての参照も変更する必要があります。

キャッシュが通知される場合、別のバンドル内にあるアプリケーションのEPNにあるコンポーネントがそのキャッシュを参照できます。次の例では、1つのバンドル内のプロセッサがcache-source要素を使用して、cacheproviderのcache-idを持つ別のバンドルのキャッシュ・ソースを参照する方法を示しています。

<wlevs:processor id="myProcessor2">
<wlevs:cache-source ref="cacheprovider:cache-id">
</wlevs:processor>

注:

同一のOracle Stream Analyticsサーバーにデプロイされる1つ以上のアプリケーションのEPNアセンブリ・ファイルのOracle Coherenceキャッシュが存在する場合、ローダーまたはストアを使用して同一のキャッシュの複数のインスタンスを構成しないでください。

各EPNアセンブリ・ファイル内でローダーまたはストアを使用して同一のOracle Coherenceキャッシュをそれぞれ構成する、複数のアプリケーションを使用することによって、これを不注意で行う可能性があります。ローダーまたはストアのある同じキャッシュの複数のインスタンスを構成すると、Oracle Stream Analyticsは例外をスローします。

8.2.2 構成ファイル

coherence-cache-config.xmlファイルは基本的なOracle Coherence構成ファイルで、任意のOracle Coherenceアプリケーションでtrueとなるように、Oracle Coherence DTDに準拠する必要があります。

coherence-cache-config.xml:の詳細は、Oracle Coherenceドキュメント(http://docs.oracle.com/middleware/1213/coherence/index.html)を参照してください。

Springを使用してキャッシュのローダーまたはストアを構成する場合は、Oracle Stream Analytics Oracle Coherenceファクトリを宣言する必要があります。ファクトリを指定するには、cachestore-scheme要素を使用し、Oracle CoherenceがOracle Stream Analyticsに呼び出して、キャッシュのために構成されるローダーまたはストアへの参照を取得できるようにするためのファクトリ・クラスを含めます。ローダーまたはストアの構成における唯一の差異は、method-name要素が、ローダーが使用されるときはgetLoaderの値を持ち、ストアが使用されているときはgetStoreの値を持つことです。キャッシュ名は、入力パラメータとしてファクトリに渡します。

<cache-config>
<caching-scheme-mapping>
<cache-mapping>
<cache-name>myCoherenceCache</cache-name>
<scheme-name>new-replicated</scheme-name>
</cache-mapping>
<cache-mapping>
<cache-name>myLoaderCache</cache-name>
<scheme-name>test-loader-scheme</scheme-name>
</cache-mapping>
<cache-mapping>
<cache-name>myStoreCache</cache-name>
<scheme-name>test-store-scheme</scheme-name>
</cache-mapping>
<cache-mapping>
<cache-name>
cache1
</cache-name>
<scheme-name>
new-replicated
</scheme-name>
</cache-mapping>
</caching-scheme-mapping>
<caching-schemes>
<replicated-scheme>
<scheme-name>new-replicated</scheme-name>
<service-name>ReplicatedCache</service-name>
<backing-map-scheme>
<class-scheme>
<scheme-ref>my-local-scheme</scheme-ref>
</class-scheme>
</backing-map-scheme>
</replicated-scheme>
<class-scheme>
<scheme-name>my-local-scheme</scheme-name>
<class-name>com.tangosol.net.cache.LocalCache</class-name>
<eviction-policy>LRU</eviction-policy>
<high-units>100</high-units>
<low-units>50</low-units>
</class-scheme>
<local-scheme>
<scheme-name>test-loader-scheme</scheme-name>
<eviction-policy>LRU</eviction-policy>
<high-units>100</high-units>
<low-units>50</low-units>

<!-- A cachestore-scheme element that gets a loader starts here -->
<cachestore-scheme>
<class-scheme>
<class-factory-name>com.bea.wlevs.cache.coherence.configuration.SpringFactory
</class-factory-name>
<method-name>getLoader</method-name>
<init-params>
<init-param>
<param-type>java.lang.String</param-type>
<param-value>myCoherenceCache</param-value>
</init-param>
<init-param>
<param-type>
java.lang.String
</param-type>
<param-value>
cache1
</param-value>
</init-param>
</init-params>
</class-scheme>
</cachestore-scheme>
<!-- The cachestore-scheme element ends here -->
</local-scheme>

<local-scheme>
<scheme-name>test-store-scheme</scheme-name>
<eviction-policy>LRU</eviction-policy>
<high-units>100</high-units>
<low-units>50</low-units>

<!-- A cachestore-scheme element that gets a store starts here -->
<cachestore-scheme>
<class-scheme>
<class-factory-name>com.bea.wlevs.cache.coherence.configuration.SpringFactory
</class-factory-name>
<method-name>getStore</method-name>
<init-params>
<init-param>
<param-type>java.lang.String</param-type>
<param-value>myCoherenceCache</param-value>
</init-param>
<init-param>
<param-type>
java.lang.String
</param-type>
<param-value>
cache1
</param-value>
</init-param>
</init-params>
</class-scheme>
</cachestore-scheme>
<!-- The cachestore-scheme element ends here -->
</local-scheme>
</caching-schemes>
</cache-config>

tangosol-coherence-override.xmlファイル(オプション)

tangosol-coherence-override.xmlファイルはサーバー単位でグローバルなファイルです。これには、Oracle Coherenceドキュメントで操作構成と呼ばれているものが含まれています。このファイルには、Oracle Coherenceキャッシュのサーバー単位のグローバルな構成設定が含まれています。このファイルはXMLエディタで作成し、構成するサーバーのOracle Stream Analyticsのconfigディレクトリに置きます。

注:

Oracle Coherenceをクラスタリングに使用する場合は、tangosol-coherence-override.xmlファイルを含めないでください。

次のXMLをOracle Coherence構成ファイルに追加し、tangosol-coherence-override.xmlファイルを参照します。Oracle Stream Analyticsの起動時にOracle Coherenceが既存のOracle Coherenceクラスタへの参加を試行しないように、cluster-name要素を含めます。これが発生すると、問題が発生してOracle Stream Analyticsが起動できなくなる場合があります。

...
<coherence xml-override="/tangosol-coherence-override.xml">
<cluster-config>
<member-identity>
<cluster-name>com.bea.wlevs.example.provider</cluster-name>
</member-identity>
...
</coherence>

Oracle Stream Analyticsクラスタの詳細は、Oracle Stream Analyticsの管理のOracle Stream Analyticsのネイティブ・クラスタに関する項を参照してください。

8.2.3 キャッシュ・ローダーBean

com.oracle.cep.cacheloader パッケージは、CSVイベントをCoherenceキャッシュにロードするためのCsvCacheLoaderクラスを提供します。sourceUrlプロパティを置き換え、インバウンド・アダプタを持つキャッシュ・ローダーを使用します。

最初のアセンブリ・ファイルCSVアダプタ構成は、sourceUrlプロパティを使用してファイルをロードするCSVインバウンド・アダプタを示します。2番目のアセンブリ・ファイルCSVアダプタ・エントリは、キャッシュ・ローダーBeanをロードするCSVインバウンド・アダプタを示します。

CSVファイルのイベントのロード

<wlevs:adapter id="StockTradeCSVInboundAdapter" provider="csv-inbound">
<wlevs:listener ref="AdapterOutputChannel"/>
<wlevs:instance-property name="eventType" value="TradeEvent"/>
<wlevs:instance-property name="sourceUrl"
value="file:/scratch/mpawlan/oep9-19/oep/utils/load-generator/StockData.csv"/>
</wlevs:adapter>

キャッシュ・ローダーを使用するイベントのロード

<wlevs:cache id="csvcache" key-properties="sequenceNo"
value-type="TradeEvent" advertise="true">
<wlevs:caching-system ref="cachesys" />
</wlevs:cache>
<bean id="csvloader" class="com.oracle.cep.cacheloader.CsvCacheLoader">
<property name="cacheName" value="csvcache"/>
<property name="sourceUrl"
value="file:///scratch/juhe/view_storage/trade.csv"/>
</bean>

8.3 ローカル・キャッシュ・システムおよびキャッシュの構成

アプリケーションを構成して、Oracle Stream Analyticsローカル・キャッシュ・システムおよびキャッシュを使用できます。Oracle Stream Analyticsローカル・キャッシング・システムは、アプリケーションをマルチサーバー・ドメインにデプロイする計画がない場合に適切です。

アプリケーションをマルチサーバー・ドメインにデプロイする計画がある場合は、Oracle Coherenceキャッシュを使用します。

この章では、いくつかの構成設定について説明します。詳細は、『Oracle Stream Analyticsスキーマ・リファレンス』のコンポーネント構成スキーマに関する項およびCoherenceキャッシュ・システムに関する項を参照してください。

8.3.1 アセンブリ・ファイル

次のアセンブリ・ファイル設定により、ローカル・キャッシング・システムおよびキャッシュを構成します。value-type設定では、データベースの値をロードするイベント・タイプを指定します。

<wlevs:cache id="localcache" value-type="HelloWorldEvent">
<wlevs:caching-system ref="caching-system"/>
</wlevs:cache>
<wlevs:caching-system id="caching-system" provider="wlevs" advertise="false"/>

8.3.2 構成ファイル

次の構成ファイル設定では、ローカル・キャッシング・システムの最大サイズおよび削除ポリシーを指定します。最大サイズは、削除ポリシー発生後のメモリー内のキャッシュ要素数を指定します。また、この例ではエントリがキャッシュされる時間の最大数もミリ秒で指定します。デフォルトのtime-to-live値は無限大です。この例では3600ミリ秒を指定しています。

<caching-system>
<name>caching-system</name>
<cache>
<name>localcache</name>
<max-size>64</max-size>
<eviction-policy>LFU</eviction-policy>
<time-to-live>3600</time-to-live>
</cache>
</caching-system>

次の構成ファイル設定は、write-behind要素をキャッシュの子要素として追加します。write-behind要素を指定すると、Oracle Stream Analyticsでキャッシュ・エントリの作成または更新後に別のスレッドからキャッシュ・ストアを起動します。write-behindの子要素は次を示します。

- バッキング・ストアに書込みを戻すためにストア・バッファからピック・アップされる更新の数(batch-size)。デフォルト値は100です。

- ユーザー・スレッドがストア・バッファに書き込むために行う試行回数。ユーザー・スレッドとは、キャッシュ・エントリの作成または更新を行うスレッドです。ユーザー・スレッドによるストア・バッファへの書込み試行がすべて失敗した場合、同期的にストアを起動します(batch-write-attempts)。デフォルト値は1です。

- ユーザー・スレッドがストア・バッファへの書込み試行を中断する前に待機する、ミリ秒単位の時間(buffer-write-timeout)。ストア・バッファへの書込み試行が失敗するのは、バッファが一杯の場合のみです。タイムアウト後は、以降のバッファへの書込み試行は、buffer-write-attemptsの値に基づいて行われます。デフォルト値は100です。

<caching-system>
<name>caching-system-id</name>
<cache>
<name>cache-id</name>
<max-size>100000</max-size>
<eviction-policy>LRU</eviction-policy
<time-to-live>3600</time-to-live>
<write-behind>
<buffer-size>200</buffer-size>
<buffer-write-attempts>2</buffer-write-attempts>
<buffer-write-timeout>200</buffer-write-timeout>
</write-behind>
</cache>
</caching-system>

次の構成ファイル設定は、listeners子要素を追加し、キャッシュをリスニングするコンポーネントの動作を構成します。listener要素にはasynchronous属性があり、true (リスナーは非同期的に起動)またはfalse (リスナーは同期的に起動)のいずれかに設定できます。

work-manager-name子要素は、非同期的なリスナーの起動に使用されるワーク・マネージャを指定します。この値は、同期的起動が有効化されている場合は無視されます。キャッシュにワーク・マネージャが指定されている場合は、リスナーの呼出しについてのみこの値でオーバーライドされます。work-manager-name要素の値は、Oracle Stream Analytics config.xmlサーバー構成ファイルのwork-manager設定のname要素と一致します。

<caching-system>
<name>caching-system-id</name>
<cache>
<name>cache-id</name>
<max-size>100000</max-size>
<eviction-policy>LRU</eviction-policy
<time-to-live>3600</time-to-live>
<write-behind>
<buffer-size>200</buffer-size>
<buffer-write-attempts>2</buffer-write-attempts>
<buffer-write-timeout>200</buffer-write-timeout>
</write-behind>
<listeners asynchronous="true">
<work-manager-name>cachingWM</work-manager-name>
</listeners>
</cache>
</caching-system>

8.4 イベント・リスナーとしてのキャッシュの構成

キャッシュを構成してネットワークを通過するイベントを受信できます。たとえば、キャッシュがチャネルをリスニングすることを指定するには、キャッシュへの参照を持つwlevs:listener要素とともにチャネルを構成します。

次の例では、チャネルが新しいイベントをキャッシュに送信するときに、イベントがキャッシュに挿入されます。チャネルでremove event(出力ウィンドウに存在する古いイベント)を送信する場合、そのイベントはキャッシュから削除されます。

<wlevs:caching-system id="caching-system-id"/>

<wlevs:cache id="cache-id" name="alternative-cache-name">
<wlevs:caching-system ref="caching-system-id"/>
</wlevs:cache>

<wlevs:channel id="tradeStream">
<wlevs:listener ref="cache-id"/>
</wlevs:channel>

8.5 キーによるキャッシュのインデックス

次の項では、キャッシュのインデックスに使用するキーの指定に使用可能なオプションについて説明します。

明示的にキーを指定しない場合、イベントがキャッシュに挿入されるときにイベント・オブジェクトはキーおよび値の両方として提供されます。この場合、イベント・クラスには、キー・プロパティ値を考慮するequalsおよびhashcodeメソッドの有効な実装が含まれる必要があります。

8.5.1 アセンブリ・ファイル

次の例で示されるように、key-properties属性を使用してアセンブリ・ファイル内でキー・プロパティのプロパティ名を指定します。

<wlevs:cache id="myCache" key-properties="key-property-name">
<wlevs:caching-system ref="caching-system-id"/>
</wlevs:cache>

この場合、キャッシュに挿入されるすべてのイベントで実行時にこの名前のプロパティを保持することが要求され、それ以外の場合はOracle Stream Analyticsで例外がスローされます。たとえば、キャッシュに挿入されているイベント型は次のように見えると仮定します。ここで、keyプロパティに注意します(関連するJavaソースのみが示されます)。

public class MyEvent {
private String key;
public MyEvent() {}
public MyEvent(String key) { this.key = key; }
public String getKey() { return key;}
public void setKey(String key) { this.key = key;}
}

アセンブリ・ファイルの対応する宣言は、次のようになります。

<wlevs:cache id="myCache" key-properties="key">
<wlevs:caching-system ref="caching-system-id"/>
</wlevs:cache>

8.5.2 メタデータ注釈

メタデータ注釈com.bea.wlevs.ede.api.Keyを使用して、イベント型を実装するJavaクラスにおけるイベント・プロパティに注釈を付加できます。この注釈には、属性はありません。

メタデータ注釈を使用してキーを指定するには、次のステップを実行します。

1. com.bea.wlevs.ede.api.Keyパッケージをインポートします。

2. @Key注釈をメソッドに適用します。

次の例は、MyEventイベント型のkeyプロパティがキーであることを指定する方法を示します。関連コードのみを次に示します。

import com.bea.wlevs.ede.api.Key;
public class MyEvent {
private String key;
public MyEvent() {}
public MyEvent(String key) { this.key = key; }
public String getKey() { return key; }
@Key
public void setKey(String key) { this.key = key; }
}

8.5.3 複合キー

wlevs:cache要素のkey-class属性を使用して、複数のプロパティがキーを形成する複合キーを指定できます。key-class属性値は、パブリック・フィールドがイベント・クラスのフィールドに一致するJavaBeanである必要があります。JavaBeanクラスは、java.lang.Object classからのequalsおよびhashCodeメソッドをオーバーライドする必要があります。照合はフィールド名に従って実行されます。次に例を示します。

<wlevs:cache id="myCache" key-class="key-class-name">
<wlevs:caching-system ref="caching-system-id"/>
</wlevs:cache>

key-field1およびkey-field2で構成される複合キーを持つキャッシュに対しては、次の問合せを両方とも実行できます。

SELECT stream.field2, cache.key-field1 from stream[NOW], cache WHERE stream.field2=cache.key-field1 AND stream.field2=cache.key-field2

SELECT stream.field1, cache.key-field1 from stream[NOW], cache WHERE stream.field1=cache.key-field1

8.6 イベント・ソースとしてのキャッシュの構成

キャッシュをイベント・ソースとして構成できます。キャッシュをイベント・ソースとして使用するには、com.bea.wlevs.ede.api.StreamSinkインタフェースを実装する必要があります。

次に構成を示します。

<wlevs:cache id="cache-id" name="alternative-cache-name"
caching-system="caching-system-id">
<wlevs:listener ref="cache-listener-id" />
</wlevs:cache>

8.7 キャッシュ・リスナーによるキャッシュの構成

キャッシュは、イベント処理ネットワーク内の別のコンポーネントがリスニングする対象のイベント・ソースとして構成可能です。リスニングするコンポーネントは、アダプタまたはBeanです。

キャッシュをリスニングするクラスは、次のようなイベントを受信する方法を提供するインタフェースを実装する必要があります。

- Coherenceキャッシュをリスニングするクラスは、com.tangosol.util.MapListenerインタフェースを実装する必要があります。

- Oracle Stream Analyticsローカル・キャッシュをリスニングするクラスは、com.bea.cache.jcache.CacheListenerインタフェースを実装する必要があります。

<wlevs:caching-system id="caching-system-id"/>
...
<wlevs:cache id="cache-id" name="alternative-cache-name">
<wlevs:caching-system ref="caching-system-id"/>
<wlevs:cache-listener ref="cache-listener-id" />
</wlevs:cache>
...
<bean id="cacheListenerId" class="com.bea.wlevs.example.provider.coherence"/>

例で、cacheListenerId Spring Beanは、キャッシュからのイベントをリスニングします。この場合、このコンポーネントを実装するユーザー定義クラスcom.bea.wlevs.example.MyCacheListenerは、Oracle Coherenceキャッシュをリスニングしています。com.tangosol.util.MapListenerを含む適切なOracle Coherence固有のJavaインタフェースを実装する必要があります。次の例は、この実装を示します。

package com.bea.wlevs.example.provider.coherence;

import com.tangosol.util.MapEvent;
import com.tangosol.util.MapListener;

public class LocalListener implements MapListener {
public static int deleted = 0;
public static int inserted = 0;
public static int updated = 0;

public void entryDeleted(MapEvent event) { deleted++; }
public void entryInserted(MapEvent event) { inserted++; }
public void entryUpdated(MapEvent event) { updated++; }
}

8.8 サードパーティのキャッシング・システムおよびキャッシュの構成

サードパーティのキャッシング・システムおよびキャッシュを使用するようにアプリケーションを構成できます。

サードパーティのキャッシング・システムおよびキャッシュの構成

1. サードパーティのキャッシング・システムをOracle Stream Analyticsキャッシング・システム・プロバイダとして定義するためのプラグインを作成します。

- com.bea.wlevs.cache.spi.CachingSystemインタフェースの実装

- この種類のキャッシング・システムを作成するファクトリの作成

- プロバイダ・タイプを識別する属性を持つファクトリの登録

2. EPNアセンブリ・ファイルでキャッシング・システムを宣言します。

wlevs:caching-system要素を使用すると、サードパーティの実装を宣言できます。classまたはprovider属性を使用すると、追加情報を指定できます。

簡略化するために、Oracle Stream Analyticsアプリケーション・バンドル自体の内部にサードパーティの実装を組み込み、パッケージのインポート/エクスポート、サードパーティの実装を含む個別のバンドルのライフサイクル管理を避けることができます。この場合、wlevs:caching-system要素は、次の例で示すようにEPNアセンブリ・ファイル内で表示されます。

<wlevs:caching-system id="caching-system-id"
class="third-party-implementation-class"/>

class属性は、com.bea.wlevs.cache.spi.CachingSystemインタフェースを実装する必要があるJavaクラスを指定します。このインタフェースの詳細は、Oracle Stream Analytics Java APIリファレンスを参照してください。

サードパーティのキャッシュ処理実装を、それを使用しているOracle Stream Analyticsアプリケーションとして同一のバンドル内に組み込むことができないか、または組み込みたくない場合があります。この場合、Springアプリケーション・コンテキストが必ずadvertise属性を持つwlevs:caching-system要素を含む、個別のバンドルを作成する必要があります。

<wlevs:caching-system id ="caching-system-id"
class="third-party-implementation-class" advertise="true"/>

または、実装のバンドルを参照元のバンドルから切り離す必要がある場合や、Javaプロセスを通じて複数のキャッシング・システムがサポートされるキャッシング実装を接続している場合は、プロバイダとしてファクトリを指定できます。

<wlevs:caching-system id ="caching-system-id" provider="caching-provider"/>
<factory id="factory-id" provider-name="caching-provider">
<class>the.factory.class.name</class>
</factory>

ファクトリ・クラス(the.factory.class.name)は、com.bea.wlevs.cache.spi.CachingSystemFactoryインタフェースを実装する必要があります。このインタフェースはcreateメソッドを持ち、このメソッドはcom.bea.wlevs.cache.spi.CachingSystemインスタンスを戻します。

アプリケーション・バンドルが使用を開始できるよう、アプリケーション・バンドルとともにこのバンドルをデプロイする必要があります。

3. EPNアセンブリ・ファイルでキャッシング・システムに1つ以上のキャッシュを追加します。

<wlevs:caching-system id ="caching-system-id" provider="caching-provider"/>
...
<wlevs:cache id="cache-id" name="alternative-cache-name">
<wlevs:caching-system ref="caching-system-id"/>
</wlevs:cache>

オプションのname属性は、キャッシング・システムでキャッシュ名がそのIDと異なる場合のみ指定します。wlevs:caching-systemの子要素は、キャッシュを含む宣言済のキャッシング・システムを参照します。この子要素は、複数のキャッシング・システムが(暗黙的または明示的に)宣言されている場合や、キャッシング・システムが異なるアプリケーションまたはバンドルに含まれている場合にのみ指定する必要があります。

advertise属性を使用して、キャッシング・システムおよびキャッシュをOSGIサービスとしてエクスポートできます。

<wlevs:caching-system id="caching-system-id" advertise="true"/>
...
<wlevs:cache id="cache-id" name="alternative-cache-name" advertise="true" >
<wlevs:caching-system ref="caching-system-id"/>
</wlevs:cache>

公開されたキャッシュは、別のバンドルにあるアプリケーションのEPNのコンポーネントから参照できるようになります。次の例では、1つのバンドル内のプロセッサが、個別のバンドル(cacheproviderと呼ばれます)内に配置されたcache-idというIDを持つキャッシュをキャッシュ・ソースとして使用できる仕組みを示しています。

<wlevs:processor id="myProcessor2">
<wlevs:cache-source ref="cacheprovider:cache-id"/>
</wlevs:processor>

キャッシング・システムは、特定の名前に関連付けられたキャッシュの作成およびキャッシュへの参照の戻しに関する処理を行います。その結果となるキャッシュBeanは、java.util.Mapインタフェースを実装します。

4. サードパーティのキャッシュ構成ファイルまたはアプリケーションのファイルを更新することによって、サードパーティのキャッシング・システムおよびそのキャッシュを構成します。

サードパーティのキャッシュのドキュメントを参照してください。

5. オプションで、1つ以上の追加cache要素の子要素を持つ適切な構成ファイルを更新することによって、デフォルトのサードパーティのキャッシュ構成をオーバーライドします。サードパーティのキャッシュのドキュメントを参照してください。

- イベント・シンクをイベント処理ネットワーク内で別のコンポーネントへのリスナーとして構成することによって、キャッシュがイベント・シンクであると指定します。

- キャッシュが、イベント処理ネットワーク内の別のコンポーネントがリスニングする対象のイベント・ソースであると指定します。

- キャッシュ・ローダーまたはストアを構成します。

6. アプリケーションをアセンブルするとき、META-INF/MANIFEST.MFファイルが次のインポートを含むことを確認します。

com.bea.wlevs.cache.spi; version ="<version>"

MANIFEST.MFファイルがこのインポートを含まない場合、MANIFEST.MFファイルを更新し、アプリケーションをデプロイする前にこのインポートを追加します。

8.9 キャッシュおよび他のデータ・ソース間のデータの交換

EPNのキャッシュとデータベースを含む他のデータ・ソースのデータを交換できます。たとえば、アプリケーションの起動時にデータを使用してキャッシュをロードしたり、キャッシュとデータベース間の読取り/書込み関係を作成できます。

バッキング・ストアが読取り専用である場合を含めてキャッシュがデータを読み取るだけの場合、キャッシュ・ローダーを使用する必要があります。キャッシュでデータを読み取るまたは書き込む場合、キャッシュ・ストアを使用します。どちらの場合も、関係の作成には、特定の構成およびデータ・ソースとの通信方法を認識するJavaクラスが含まれます。

8.9.1 読取り専用データ・ソースからのキャッシュ・データのロード

キャッシュ・ローダーを使用して、EPNのキャッシュに読取り専用データ・ソースからデータをロードできます。キャッシュ・ローダーはキャッシュにキャッシュ・オブジェクトをロードするJavaクラスです。適切なインタフェースを実装してキャッシュと通信するローダー・クラスを有効にするJavaクラスを書き込むことによって、キャッシュ・ローダーを作成します。wlevs:cache要素のwlevs:cache-loader子要素を使用してロード処理を行うBeanを指定することによって、キャッシュ・ローダーを構成します。

バッキング・ストアが読取り/書込みである場合は、かわりにキャッシュ・ストアを使用します(読取り/書込みデータ・ソースでのデータの交換を参照)。

キャッシュ・ローダーを作成する場合、次のようにインタフェースを実装します。

- キャッシュ・データをOracle Coherenceキャッシュにロードするには、com.tangosol.net.cache.CacheLoaderを含む適切なOracle Coherence固有のJavaインタフェースを実装するクラスを作成します。例8-2を参照してください。

- キャッシュ・データをOracle Stream Analyticsローカル・キャッシュにロードするには、com.bea.cache.jcache.CacheLoaderインタフェースを実装するクラスを作成します。このインタフェースには、単一のオブジェクトのキャッシュへのロードをカスタマイズするためのloadメソッドが含まれます。Oracle Stream Analyticsは、リクエストされたオブジェクトがキャッシュ内にないときにこのメソッドを呼び出します。このインタフェースには、キャッシュ全体のロードをカスタマイズするために実装するloadAllメソッドも含まれます。

例8-1では、localLoaderのBeanは、バッキング・ストアが読取り専用のときにイベントをOracle Coherenceキャッシュにロードします。

Coherenceキャッシュを使用していて構成ファイルでキャッシュ・ローダーを指定した場合、Coherenceキャッシュ構成ファイルで対応するクラス・ファクトリ・メソッド名も指定する必要があることに注意してください。キャッシュ・ローダーには、com.bea.wlevs.cache.coherence.configuration.SpringFactoryのgetLoaderメソッドを指定します。コードの例は、Oracle Coherenceキャッシュ・システムおよびキャッシュの構成を参照してください。

例8-1 キャッシュ・ローダー用Oracle CoherenceキャッシュのEPNアセンブリ・ファイル

<wlevs:caching-system id="caching-system-id"/>
<wlevs:cache id="myCache" advertise="false">
<wlevs:caching-system ref="caching-system-id"/>
<wlevs:cache-loader ref="localLoader"/>
</wlevs:cache>
<bean id="localLoader"
class="com.bea.wlevs.example.provider.coherence.LocalLoader"/>

例8-2 Oracle CoherenceキャッシュのLocalLoaderの実装

package com.bea.wlevs.example.provider.coherence;

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import com.bea.wlevs.example.provider.event.ProviderData;
import com.tangosol.net.cache.CacheLoader;

public class LocalLoader implements CacheLoader {
public static int loadCount = 0;
public static Set keys = new HashSet();

public LocalLoader() {
}
public Object load(Object key) {
loadCount++;
keys.add(key);
return new ProviderData((String) key);
}
public Map loadAll(Collection keys) {
Map result = new HashMap();

for (Object key : keys) {
result.put(key, load(key));
}
return result;
}
}

8.9.2 読取り/書込みデータ・ソースでのデータの交換

キャッシュ・ストアを使用すると、EPNのキャッシュで読取り/書込みデータ・ソースとデータを交換できます。キャッシュ・ストアはキャッシュとキャッシュ・オブジェクトを交換するJavaクラスです。適切なインタフェースを実装してデータソースと通信するために有効にするJavaクラスを書き込むことによって、キャッシュ・ストアを作成します。次に、wlevs:cache要素のwlevs:cache-store子要素を使用してデータソースと通信するBeanを指定することによって、キャッシュ・ストアをEPNに追加します。

バッキング・ストアが読取り専用である場合は、かわりにキャッシュ・ローダーを使用します(読取り専用データ・ソースからのキャッシュ・データのロードを参照)。

キャッシュ・ストアを作成する場合、次のようにインタフェースを実装します。

- キャッシュ・データとOracle Coherenceキャッシュを交換するには、com.tangosol.net.cache.CacheStoreを含む適切なOracle Coherence固有のJavaインタフェースを実装するクラスを作成します。この例は、例8-4を参照してください。

- キャッシュ・データとOracle Stream Analyticsローカル・キャッシュを交換するには、com.bea.cache.jcache.CacheStoreインタフェースを実装するクラスを作成します。このインタフェースには、受け渡されたキーを使用してバッキング・ストアにデータを保存するstoreメソッドが含まれます。Oracle Stream Analyticsは、データをキャッシュに挿入するときにこのメソッドを呼び出します。このインタフェースは、write-behind構成要素を使用してキャッシュに非同期書込みを構成した場合に、バッキング・ストアへのデータの一括保存に使用するstoreAllメソッドも含みます。

例8-3では、localStoreのBeanは、バッキング・ストアが読取り/書込みのときにイベントをキャッシュにロードします。

Spring構成ファイルでキャッシュ・ストアを指定した場合、Coherenceキャッシュ構成ファイルで対応するクラス・ファクトリ・メソッド名も指定する必要があることに注意してください。キャッシュ・ストアには、com.bea.wlevs.cache.coherence.configuration.SpringFactoryのgetStoreメソッドを指定します。コードの例は、Oracle Coherenceキャッシュ・システムおよびキャッシュの構成を参照してください。

例8-3 キャッシュ・ストア用Oracle CoherenceキャッシュのEPNアセンブリ・ファイル

<wlevs:caching-system id="caching-system-id"/>
<wlevs:cache id="myCache" advertise="false">
<wlevs:caching-system ref="caching-system-id"/>
<wlevs:cache-store ref="localStore"/>
</wlevs:cache>
<bean id="localStore"
class="com.bea.wlevs.example.provider.coherence.LocalStore"/>

例8-4 Oracle CoherenceキャッシュのLocalStoreの実装

package com.bea.wlevs.example.provider.coherence;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import com.bea.wlevs.example.provider.event.ProviderData;
import com.tangosol.net.cache.CacheStore;

public class LocalStore implements CacheStore {
public static int eraseCount = 0;
public static int storeCount = 0;
public static int loadCount = 0;

public void erase(Object key) {
eraseCount++;
}
public void eraseAll(Collection keys) {
for (Object key : keys) {
erase(key);
}
}
public void store(Object key, Object value) {
//
// Do the store operation here.
//
}
public void storeAll(Map entries) {
for (Map.Entry entry : (Set <Map.Entry>)entries.entrySet()) {
store(entry.getKey(), entry.getValue());
}
}
public Object load(Object key) {
loadCount++;
return new ProviderData((String) key);
}
public Map loadAll(Collection keys) {
Map result = new HashMap();
for (Object key : keys) {
result.put(key, load(key));
}
return result;
}
}

8.10 アプリケーション・コードからキャッシュへのアクセス

キャッシュを構成すると、Oracle Stream Analyticsアプリケーションのいくつかのコンポーネントからキャッシュにアクセスできます。

この項では、その実行方法について説明します。

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

- Oracle CQL文からキャッシュへのアクセス

- アダプタからキャッシュへのアクセス

- ビジネスPOJOからキャッシュへのアクセス

- Oracle CQLユーザー定義関数からキャッシュへのアクセス

- JMXによるキャッシュへのアクセス

アプリケーションをアセンブルおよびデプロイする前に、META-INF/MANIFEST.MFを編集して実装で必要になるパッケージをインポートします。たとえば、アプリケーションでキャッシュ・リスナー、キャッシュ・ローダーまたはキャッシュ・ストアを実装する場合は、Coherence APIを含むcom.tangosol.net.cacheパッケージを実装します。

Oracle Stream Analyticsには、アプリケーションで特定のタスクを実行するために使用できるキャッシングAPIが用意されています。APIは、キャッシュへのアクセス、およびキャッシュ・ローダー、リスナー、ストアの作成に使用されるAPIを含むcom.bea.cache.jcacheパッケージ内にあります。ローダー機能、リスナー機能およびストア機能を使用するには、com.tangosol.netパッケージおよびcom.tangosol.net.cacheパッケージをインポートします。

EPNアセンブリ・ファイルおよびコンポーネント構成ファイルを使用して、キャッシング・システムおよびキャッシュを作成、構成および接続します。この場合、通常はアプリケーションでCacheおよびCachingSystemインタフェースを明示的には使用しません。これらは標準構成を上回る追加要件がある場合にのみ使用します。たとえば、サード・パーティ製キャッシュ・プロバイダとの統合を提供する場合は、CachingSystemインタフェースを使用する必要があります。キャッシュでjava.util.Mapインタフェース以外の操作を実行する必要がある場合は、Cacheインタフェースを使用できます。

Oracle Stream Analyticsのローカル・キャッシュ用のキャッシュ・リスナー、キャッシュ・ローダー、またはキャッシュ・ストアを作成する場合、書き込むBeanはCacheListener、CacheLoader、またはCacheStoreインタフェースを実装する必要があります。

Oracle Coherenceキャッシュ用のキャッシュ・リスナー、キャッシュ・ローダー、またはキャッシュ・ストアを作成する場合、書き込むBeanは適切なOracle Coherenceインタフェースを実装する必要があります。

サードパーティのキャッシュ用のキャッシュ・リスナー、キャッシュ・ローダー、またはキャッシュ・ストアを作成する場合、書き込むBeanは適切なサードパーティのキャッシュ・インタフェースを実装する必要があります。

8.10.1 Oracle CQL文からキャッシュへのアクセス

チャネルなどのイベント・ソースを参照するのとまったく同じ方法でOracle CQL文からキャッシュを参照できます。この機能によって、標準ストリーミング・データを個別ソースからのデータを使用して質を高めることができます。次の例のコードは、S1という標準チャネルからの取引イベントとstockCacheというキャッシュからの銘柄記号データを結合する、有効なOracle CQL問合せを示します。

Oracle CQL問合せにおいてキャッシュを使用するとき、次の制約を遵守する必要があります。

- キャッシュに問い合せる場合は、常に[Now]ウィンドウに対して結合する必要があります。
これによって、問合せはキャッシュのスナップショットに対して実行されることが保証されます。他のウィンドウ・タイプに対して結合する場合、ウィンドウの有効期限が切れる前にキャッシュが変更されると、問合せは正しくなりません。

次の例は、キャッシュに対してRangeウィンドウを結合する無効なOracle CQL問合せを示します。このウィンドウの有効期限が切れる前にキャッシュが変更される場合、問合せは正しくなりません。その結果、この問合せはOracle Stream Analyticsサーバー・エラー「外部リレーションはs[now]と結合している必要があります」を表示します。

SELECT trade.symbol, trade.price, trade.numberOfShares, company.name
FROM TradeStream [Range 8 hours] as trade, CompanyCache as company
WHERE trade.symbol = company.id

Oracle CQL問合せでキャッシュからのデータを使用する場合、チャネルの場合と同様に、データがプッシュされるのではなく、Oracle Stream Analyticsがデータを抽出します。つまり、問合せを継続すると、問合せはチャネルがtradeイベントを問合せにプッシュするときにのみ実行されます。キャッシュ内のストック・シンボル・データは問合せを実行せず、必要に応じて問合せによって抽出されるのみです。

- キャッシュ・キーに基づいて参照を行うには、必要なキー・プロパティを指定する必要があります。
スキーマ(id、group、value)を持つ(キャッシュ・キーはid)、2つのストリームSおよびCを検討してください。有効な問合せは次のとおりです。

select count(*) as n from S [now], C
where S.id = C.id

- 結合はキャッシュのキーを参照することでのみ実行される必要があります。

- ビューでキャッシュは使用できません。かわりに、結合を使用します。

- キャッシュ・データ・ソースを結合するOracle CQL文のFROM句では、1つのチャネル・ソースのみが発生できます。

- キャッシュがプロセッサ・ソースである場合は、キャッシュをEPNのチャネルに直接接続します。

- キャッシュがプロセッサ・シンクである場合は、プロセッサに直接接続できます。

Oracle CQL文からキャッシュへのアクセス

この手順では、キャッシング・システムおよびキャッシュを構成済と仮定します。詳細は、次を参照してください。

- ローカル・キャッシング・システムおよびキャッシュの構成

- Oracle Coherenceキャッシュ・システムおよびキャッシュの構成

- サードパーティのキャッシング・システムおよびキャッシュの構成

1. まだ構成済でない場合、キャッシュ・データに対応するイベント型を作成し、イベント・リポジトリに登録します。
イベントおよびイベント・タイプを参照してください。

2. キャッシュ内のデータからキー・プロパティを指定します。

3. EPNアセンブリ・ファイルで、キャッシュの構成を更新してその値のイベント型を宣言します。wlevs:cache要素のvalue-type属性を使用します。次に例を示します。

<wlevs:caching-system id="caching-system-id"/>
...
<wlevs:cache id="cache-id"
name="alternative-cache-name"
value-type="CompanyEvent">
<wlevs:caching-system ref="caching-system-id"/>
</wlevs:cache>

value-type属性は、キャッシュに含まれる値のタイプを指定します。これは、イベント型リポジトリで有効なタイプ名にする必要があります。

この属性は、Oracle CQL問合せでキャッシュが参照される場合に必要です。これは、問合せプロセッサはキャッシュ内のイベントのタイプを意識している必要があるからです。

4. EPNアセンブル・ファイルで、キャッシュを参照するOracle CQL問合せを実行するプロセッサの構成を更新します。

a. キャッシュがプロセッサ・ソースである場合は、図8-1に示すように、キャッシュをEPNのプロセッサに直接接続します。

図8-1 プロセッサ・ソースとしてキャッシュ

キャッシュを参照するwlevs:processor要素のwlevs:cache-source子要素を更新します。次に例を示します。

<wlevs:channel id="S1"/>

<wlevs:processor id="cacheProcessor">
<wlevs:source ref="S1">
<wlevs:cache-source ref="cache-id">
</wlevs:processor>

この例では、プロセッサは従来どおりにS1チャネルから押し出されるデータを持ちます。ただし、プロセッサで実行するOracle CQL問合せは、cache-idキャッシュからデータを抽出することもできます。問合せプロセッサが、FROM句のイベント型をCompanyEventなどのキャッシュによって提供されるイベント型に一致するとき、プロセッサはキャッシュからそのイベント型のインスタンスを抽出します。

b. キャッシュがプロセッサ・シンクである場合は、図8-2に示すように、EPNのチャネルを使用してプロセッサをキャッシュに接続します(つまり、プロセッサとキャッシュ・シンクの間にチャネルが必要です)。

図8-2 プロセッサ・シンクとしてキャッシュ

この場合、アプリケーション・アセンブリ・ファイルは次のようになります。

<wlevs:channel id="channel1" event-type="StockTick">
<wlevs:listener ref="processor" />
</wlevs:channel>
<wlevs:processor id="processor">
<wlevs:listener ref="channel2" />
</wlevs:processor>
<wlevs:channel id="channel2" event-type="StockTick">
<wlevs:listener ref="cache-id" />
</wlevs:channel>

SELECT  S1.symbol, S1.lastPrice, stockCache.description
FROM    S1 [Now], stockCache
WHERE   S1.symbol = stockCache.symbol

8.10.2 アダプタからキャッシュへのアクセス

アダプタも、他のBeanを参照するための標準Springメカニズムを使用してキャッシュに組み込むことができます。キャッシュBeanは、java.util.Mapインタフェースを実装します。このインタフェースは、組み込まれたキャッシュにアクセスするためにアダプタが使用します。

まず、EPNアセンブリ・ファイル内のアダプタの構成は、次の例で示すように、wlevs:instance-property子要素を使用して更新する必要があります。

<wlevs:caching-system id="caching-system-id"/>
...
<wlevs:cache id="cache-id" name="alternative-cache-name">
<wlevs:caching-system ref="caching-system-id"/>
</wlevs:cache>
...
<wlevs:adapter id="myAdapter" provider="myProvider">
<wlevs:instance-property name="map" ref="cache-id"/>
</wlevs:adapter>

この例では、wlevs:instance-propertyのref属性はwlevs:cache要素のid値を参照します。Oracle Stream Analyticsは、自動的にアダプタにキャッシュ(java.util.Mapとして実装)を組み込みます。

アダプタのJavaソースでは、アダプタによるキャッシュ処理の機能を実装するコードを持つsetMap (Map)メソッドを追加します。

package com.bea.wlevs.example;
…
import java.util.Map;
public class MyAdapter implements Runnable, Adapter, EventSource, SuspendableBean  {
...
public void setMap (Map map) {...}
}

8.10.3 ビジネスPOJOからキャッシュへのアクセス

EPNアセンブリ・ファイルで標準のSpring Beanとして構成されたビジネスPOJOでは、他のBeanを参照するための標準のSpringメカニズムを使用して、キャッシュを挿入することができます。この方法によって、POJOではキャッシュを表示および操作できます。キャッシュBeanでは、ビジネスPOJOが挿入されたキャッシュにアクセスするために使用するjava.util.Mapインタフェースが実装されます。キャッシュBeanではjava.util.Mapのベンダー固有のサブインタフェースを実装することもできますが、移植性のためにMapを実装することをお薦めします。

まず、EPNアセンブリ・ファイル内のビジネスPOJOの構成は、FX例(Oracle Stream Analyticsイベント処理スタート・ガイドの外国為替(FX)の例に関する項を参照)のOutput Beanに基づいた次の例で示されるように、property子要素を使用して更新する必要があります。

<wlevs:caching-system id="caching-system-id"/>
...
<wlevs:cache id="cache-id" name="alternative-cache-name">
<wlevs:caching-system ref="caching-system-id"/>
</wlevs:cache>
...
<bean class="com.bea.wlevs.example.helloworld.HelloWorldBean">
<property name="map" ref="cache-id"/>
</bean>

この例では、property要素のref属性はwlevs:cache要素のid値を参照します。Oracle Stream Analyticsは、自動的にビジネスPOJO Beanにキャッシュ(java.util.Mapとして実装)を組み込みます。

ビジネスPOJO BeanのJavaソースでは、POJOによるキャッシュ処理の機能を実装するコードを持つsetMap (Map)メソッドを追加します。

package com.bea.wlevs.example.helloworld;
…
import java.util.Map;
public class HelloWorldBean implements EventSink {
...
public void setMap (Map map) {...}
}

8.10.4 Oracle CQLユーザー定義関数からキャッシュへのアクセス

標準イベント・ストリームに加えて、Oracle CQLルールはユーザー定義関数のメンバー・メソッドも起動できます。

これらのユーザー定義関数は標準Javaクラスとして実装され、次の例で示すように、Oracle CQLプロセッサのコンポーネント構成ファイル内で宣言されます。

<bean id="orderFunction" class="orderFunction-impl-class"/>

関連するOracle CQLルールが実行されるプロセッサは、ref属性を持つSpring Beanを参照し、wlevs:function子要素を使用してユーザー定義関数に組み込まれる必要があります。

<wlevs:processor id= "tradeProcessor">
<wlevs:function ref="orderFunction"/>
</wlevs:processor>

また、wlevs:function要素でBeanクラスを指定できます。

<wlevs:processor id="testProcessor">
<wlevs:listener ref="providerCache"/>
<wlevs:listener ref="outputCache"/>
<wlevs:cache-source ref="testCache"/>
<wlevs:function function-name="mymod" exec-method="execute" />
<bean class="com.bea.wlevs.example.function.MyMod"/>
</wlevs:function>
</wlevs:processor>

次のOracle CQLルールは、tradeProcessorプロセッサに構成されると仮定され、orderFunctionユーザー定義関数のexistsOrderメソッドを起動する方法を示します。

INSERT INTO InstitutionalOrder
SELECT er.orderKey AS key, er.symbol AS symbol, er.shares as cumulativeShares
FROM ExecutionRequest er [Range 8 hours]
WHERE NOT orderFunction.existsOrder(er.orderKey)

別のBeanを参照する標準Springメカニズムを使用してキャッシュを持つ関数を組み込むことによって、キャッシュにアクセスするためのユーザー定義関数を構成することもできます。キャッシュBeanは、java.util.Mapインタフェースを実装します。このインタフェースは、組み込まれたキャッシュにアクセスするためにユーザー定義関数が使用します。

まず、EPNアセンブリ・ファイル内のユーザー定義関数の構成は、次の例で示すように、wlevs:property子要素を使用して更新する必要があります。

<wlevs:caching-system id="caching-system-id"/>
...
<wlevs:cache id="cache-id" name="alternative-cache-name">
<wlevs:caching-system ref="caching-system-id"/>
</wlevs:cache>
...
<bean id="orderFunction" class="orderFunction-impl-class">
<wlevs:property name="cache" ref="cache-id"/>
</bean>

この例では、wlevs:property要素のref属性はwlevs:cache要素のid値を参照します。Oracle Event Processingは、自動的にユーザー定義関数にキャッシュ(java.util.Mapとして実装)を組み込みます。

ユーザー定義関数のJavaソースでは、関数によるキャッシュ処理の機能を実装するコードを持つsetMap (Map)メソッドを追加します。

package com.bea.wlevs.example;
…
import java.util.Map;
public class OrderFunction {
...
public void setMap (Map map) {...}
}

ユーザー定義関数の詳細は、『Oracle CQL言語リファレンス』のユーザー定義に関する項を参照してください。

8.10.5 JMXによるキャッシュへのアクセス

実行時、Oracle Stream Analyticsがキャッシング・システムと定義するキャッシュにデプロイするMBeansおよびJMXを使用して、キャッシュにプログラムからアクセスできます。詳細は、Oracle Stream Analyticsの管理のJMXに関する項を参照してください。

8.10.5.1 Oracle Stream Analytics Visualizerを使用したJMXによるキャッシュへのアクセス方法

JMXを使用してキャッシング・システムまたはキャッシュにアクセスする最も単純かつエラーの少ない方法は、Oracle Stream Analytics Visualizerを使用することです。詳細は、『Oracle Stream Analyticsビジュアライザの使用』のJMX管理に関する項を参照してください。

8.10.5.2 Javaを使用したJMXによるキャッシュへのアクセス方法

JMXを使用してキャッシング・システムまたはキャッシュにアクセスする最も単純かつエラーの少ない方法は、Oracle Stream Analytics Visualizerを使用することです(Oracle Stream Analytics Visualizerを使用したJMXによるキャッシュへのアクセス方法を参照)。あるいは、書き込まれるJavaコードを使用したJMXによるキャッシング・システムまたはキャッシュにアクセスできます。

Oracle Stream Analyticsにより、アプリケーションでステージとして使用するキャッシュごとにStageMBeanが作成されます。このMBeanのTypeはStageです。

Javaを使用したJMXでキャッシュにアクセスするには:

1. Oracle Stream Analyticsサーバーが提供するJMXサービスに接続します。

詳細は、Oracle Stream Analyticsの管理のJMXサーバーへの接続に関する項を参照してください。

2. 次のいずれかを使用してキャッシュStageMbeanのリストを取得します。

- CachingSystemMBean.getCacheMBeans()

- ApplicationMBean.getStageMBeans()

3. キャッシング・システム内でキャッシュを表す所定のStageMBeanのObjectNameを取得します。

ObjectName cacheName = ObjectName.getInstance (
'com.bea.wlevs:Name = newCache,Type=Stage,CachingSystem=newCachingSystem,Application=provider'
);

4. このObjectNameを持つStageMBeanのプロキシ・インスタンスを取得します。

StageMBean cache = (StageMBean) MBeanServerInvocationHandler.newProxyInstance(
server, cacheName, StageMBean.class, false
);

5. StageMBeanのメソッドを使用してキャッシュにアクセスします。

9 EclipseLink、JPAおよびOracle Coherence

Oracle Stream Analyticsインストールには、アプリケーションでのJava Persistence API (JPA)の使用をサポートするためにEclipseLink 2.4.2オープン・ソース・マッピングおよび永続性フレームワークが含まれます。JPAは、オブジェクト・リレーショナル・マッピング(ORM)およびエンタープライズJavaの永続性の標準です。

この章では、EclipseLinkおよびJPAを使用してデータベースからの読取りおよびデータベースへの書込みを行う2つのOracle Stream Analyticsサンプル・アプリケーションとして、HelloWorldおよびJPA-Coherence-Sample-Codeを示します。JPA-Coherence-Sample-Codeでは、アプリケーションおよびサーバーがクラスタ化された環境内でデータ更新を調整するためにCoherenceキャッシュも使用します。

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

- 高度な手順

- HelloWorldの例

- JPA Coherenceの例

9.1 高度な手順

次の高度なステップを使用して、EclipseLinkが含まれるOracle Stream Analyticsアプリケーションを作成します。

1. 必要に応じて、JPAおよびOracle Coherenceが含まれるOracle Stream Analyticsアプリケーションを作成します。

2. 正しいJPA構成を使用してpersistence.xmlファイルを作成します。このファイルには、ランタイム操作を制御するプロパティが含まれます。

3. persistence.xmlファイルをアプリケーションのMETA-INFディレクトリに配置します。

4. アプリケーションをバンドルおよびデプロイします。

EclipseLinkの詳細は、http://eclipse.org/eclipselink/を参照してください。

注:
CQLサンプルをAIX 6.1の日本語プラットフォームで実行すると、コヒーレンス・ソケット例外が発生します。この問題の解決方法:
-Djava.net.preferIPv4Stack=trueパラメータをstartwlevs.shスクリプトの最後の行に追加します。

注:
AIXプラットフォームでは、空間サンプルはサポートされていません。

9.2 HelloWorldの例

HelloWorldの例では、EclipseLinkを使用して、HelloWorldイベントをアクセスおよび格納するために読取りおよび書込みモードでデータ・ソースへのJDBC接続を確立します。

この例では、HelloWorldイベントには日時情報が含まれます。

この例は次のファイルで構成されており、これらについてこの項で説明します。

- persistence.xml構成ファイル

- HelloWorldAdapter.java

- HelloWorldEvent.java

- HelloWorldBean.java

9.2.1 persistence.xml構成ファイル

次のpersistence.xmlファイルには、helloworldと呼ばれる1つの永続性ユニット(persistence-unit)があります。Oracle Stream AnalyticsはJava SE環境であるため、helloworld永続性ユニットのtransaction-typeはRESOURCE_LOCALです。EclipseLinkのプロパティは、データベースの読取りおよび書込み操作とロギング用の設定を指定します。この例では、データベース内のオブジェクトを表す管理対象の永続可能クラスはcom.bea.wlevs.event.example.helloworld.HelloWorldEventです。

このpersistence.xmlファイルには、コメントアウトされ、falseに設定されたJPAロギングのエントリがあります。これらの設定のコメントを解除してtrueに設定することにより、アプリケーションの動作をデバッグまたは監視できます。プロパティの設定の詳細は、http://eclipse.org/eclipselink/documentation/2.4/jpa/extensions/toc.htmを参照してください。

<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence         http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="helloworld" transaction-type="RESOURCE_LOCAL">
<class>com.bea.wlevs.event.example.helloworld.HelloWorldEvent</class>
<properties>
<property name="eclipselink.jdbc.read-connections.min" value="1"/>
<property name="eclipselink.jdbc.write-connections.min" value="1"/>
<!--
<property name="eclipselink.logging.timestamp" value="false"/>
<property name="eclipselink.logging.thread" value="false"/>
<property name="eclipselink.logging.session" value="false"/>
<property name="eclipselink.logging.exceptions" value="false"/>
<property name="eclipselink.logging.connection" value="false"/>
<property name="eclipselink.logging.level" value="FINER"/>
-->
</properties>
</persistence-unit>
</persistence>

9.2.2 HelloWorldAdapter.java

HelloWorldAdapter.javaクラスは、HelloWorldEventタイプのイベントを継続的に作成するカスタム・スレッドのアダプタです。アプリケーションにより、DateFormatタイプのメッセージ・テキストが作成され、これは、HelloWorldEventタイプのイベントを作成するためにgenerateHelloMessageメソッドによって使用されます。

Oracle Stream Analyticsフレームワークは、setEventSenderメソッドを呼び出すことにより、StreamSenderインスタンスを使用してeventSenderプライベート変数を初期化します。StreamSenderインスタンスは、StreamSourceインスタンスによって発行されたイベントをStreamSinkリスナーに送信します。この例では、StreamSinkリスナーはHellowWorldBeanインスタンスです。

package com.bea.wlevs.adapter.example.helloworld;

import java.text.DateFormat;
import java.util.Date;
import com.bea.wlevs.ede.api.RunnableBean;
import com.bea.wlevs.ede.api.StreamSender;
import com.bea.wlevs.ede.api.StreamSource;
import com.bea.wlevs.event.example.helloworld.HelloWorldEvent;

public class HelloWorldAdapter implements RunnableBean, StreamSource {
private static final int SLEEP_MILLIS = 300;
private DateFormat dateFormat;
private String message;
private boolean suspended;
private StreamSender eventSender;

public HelloWorldAdapter() {
super();
dateFormat = DateFormat.getTimeInstance();
}
public void run() {
suspended = false;
while (!isSuspended()) { // Generate messages forever...
generateHelloMessage();
try {
synchronized (this) {
wait(SLEEP_MILLIS);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void setMessage(String message) {
this.message = message;
}
private void generateHelloMessage() {
String message = this.message + dateFormat.format(new Date());
HelloWorldEvent event = new HelloWorldEvent();
event.setMessage(message);
eventSender.sendInsertEvent(event);
}
public void setEventSender(StreamSender sender) {
eventSender = sender;
}
public synchronized void suspend() {
suspended = true;
}
private synchronized boolean isSuspended() {
return suspended;
}
}

9.2.3 HelloWorldEvent.java

HelloWorldEvent.javaクラスは、メッセージからイベントを作成します。HelloWorldAdapter.generateHelloMessageメソッドは、HelloWorldEvent.setMessageメソッドをコールしてメッセージからイベントを作成します。HelloWorldBeanクラスは、messageおよび生成されたidをデータ・ストアに格納し、これらをデータ・ストアから取得します。

package com.bea.wlevs.event.example.helloworld;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class HelloWorldEvent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String message;

public String getMessage() {
return message;
}

public void setMessage (String message) {
this.message = message;
}
}

9.2.4 HelloWorldBean.java

HelloWorldBean.javaクラスは、HelloWorldEventからイベントを取得し、JPAを使用してデータベースで読取りおよび書込み操作を実行するイベント・シンクおよびソースです。

Oracle Stream Analyticsフレームワークは、setEventSenderメソッドを呼び出すことにより、StreamSenderインスタンスを使用してm_eventSenderプライベート変数を初期化します。onInserEventメソッドは、StreamSourceインスタンスによって発行されたイベントをStreamSinkリスナーにダウンストリーム送信します。

package com.bea.wlevs.example.helloworld;

import java.util.HashMap;
import java.util.List;
import javax.annotation.Resource;
import javax.sql.DataSource;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.springframework.beans.factory.DisposableBean;
import org.eclipse.persistence.config.PersistenceUnitProperties;
import com.bea.wlevs.ede.api.StreamSink;
import com.bea.wlevs.ede.api.StreamSource;
import com.bea.wlevs.ede.api.StreamSender;
import com.bea.wlevs.event.example.helloworld.HelloWorldEvent;

public class HelloWorldBean implements StreamSink, StreamSource, DisposableBean {
private static final String PERSISTENCE_UNIT_NAME = "helloworld";
private EntityManagerFactory m_entityMgrFactory;
private EntityManager m_entityMgr;
private DataSource m_ds;
private boolean m_shuttingDown;
private StreamSender m_eventSender;

public void setEventSender(StreamSender sender){
m_eventSender = sender;
}
private void setupEntityManager(){
if (m_entityMgr!=null)
return;
HashMap props = new HashMap();
props.put(PersistenceUnitProperties.NON_JTA_DATASOURCE, m_ds);
props.put("eclipselink.ddl-generation", "create-tables");
props.put("eclipselink.ddl-generation.output-mode", "database");
m_entityMgrFactory = Persistence.createEntityManagerFactory
(PERSISTENCE_UNIT_NAME, props);
m_entityMgr = m_entityMgrFactory.createEntityManager();
}
public void onInsertEvent(Object event){
if (m_shuttingDown)
return;
setupEntityManager();
if (event instanceof HelloWorldEvent) {
HelloWorldEvent helloWorldEvent = (HelloWorldEvent) event;
System.out.println("Message: " + helloWorldEvent.getMessage());
m_entityMgr.getTransaction().begin();
try {
m_entityMgr.persist(helloWorldEvent);
m_entityMgr.getTransaction().commit();
} finally {
if (m_entityMgr.getTransaction().isActive())
m_entityMgr.getTransaction().rollback();
}
}
Query q = m_entityMgr.createQuery("select t from HelloWorldEvent t");
List<HelloWorldEvent> hwlist = q.getResultList();
System.out.println("Stored " + hwlist.size() + " helloworld events");
m_eventSender.sendInsertEvent(event);
}
@Resource(name="derbyDS")
public void setDataSource(DataSource ds){
m_ds = ds;
}
public void destroy(){
m_shuttingDown = true;

if (m_entityMgr!=null){
m_entityMgr.close();
m_entityMgr=null;
}
if (m_entityMgrFactory!=null){
m_entityMgrFactory.close();
m_entityMgrFactory=null;
}
}
}

9.3 JPA Coherenceの例

JPA Coherenceの例では、CoherenceのCacheLoaderまたはCacheStoreインタフェース用のEclipseLink JPA実装の使用方法を示します。

9.3.1 persistence.xml構成ファイル

EclipseLinkのプロパティは、データベースの読取りおよび書込み操作とロギング用の設定を指定します。データベース内のオブジェクトを表す管理対象の永続可能クラスは、com.oracle.cep.sample.PriceTargetおよびcom.oracle.cep.sample.SaleEventです。

このpersistence.xmlファイルには、コメントアウトされ、falseに設定されたJPAロギングのエントリがあります。これらの設定のコメントを解除してtrueに設定することにより、アプリケーションの動作をデバッグまたは監視できます。プロパティの設定の詳細は、http://eclipse.org/eclipselink/documentation/2.4/jpa/extensions/toc.htmを参照してください。

<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence      http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="derby" transaction-type="RESOURCE_LOCAL">
<class>com.oracle.cep.sample.PriceTarget</class>
<class>com.oracle.cep.sample.SaleEvent</class>
<properties>
<property name="eclipselink.jdbc.read-connections.min" value="1"/>
<property name="eclipselink.jdbc.write-connections.min" value="1"/>
<property name="javax.persistence.jdbc.driver"
value="org.apache.derby.jdbc.EmbeddedDriver"/>
<property name="javax.persistence.jdbc.url"
value="jdbc:derby:test1;create=true"/>
<property name="eclipselink.ddl-generation" value="create-tables"/>
<property name="eclipselink.ddl-generation.output-mode" value="database"/>
<!--
<property name="eclipselink.logging.timestamp" value="false"/>
<property name="eclipselink.logging.thread" value="false"/>
<property name="eclipselink.logging.session" value="false"/>
<property name="eclipselink.logging.exceptions" value="false"/>
<property name="eclipselink.logging.connection" value="false"/>
<property name="eclipselink.logging.level" value="FINER"/>
-->
</properties>
</persistence-unit>
</persistence>

9.3.2 クラス

この例は、次のクラスで構成されています。

- CoherenceMapListener.java

- PriceTarget.java

- PriceTargetLoader.java

- SaleEvent.java

- SaleEventsGenerator.java

この例では、一連の初期アイテムが発売され、要求されたターゲット価格がデータ・ストアで設定されます。データ・ストアは、CacheLoaderで使用するよう設定されているため、PriceTarget.java Coherenceキャッシュで使用可能です。SaleEventsのストリームがSaleEventsGeneratorアダプタから生成されます。販売価格がターゲット価格と一致する場合は、SaleEvent Coherenceキャッシュに格納されます。Coherence MapListener実装により、キャッシュに格納されているSaleEventsが実際にデータ・ストアでも使用可能かどうかが検証されます。

9.3.2.1 CoherenceMapListener.java

CoherenceMapListener.javaクラスは、Coherenceキャッシュにパブリッシュされたイベントをリスニングします。

package com.oracle.cep.sample;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.springframework.beans.factory.DisposableBean;
import com.tangosol.util.MapListener;
import com.tangosol.util.MapEvent;
import com.tangosol.util.ObservableMap;
import com.bea.wlevs.ede.api.InitializingBean;
import com.bea.wlevs.ede.api.StreamSource;
import com.bea.wlevs.ede.api.StreamSender;

public class CoherenceMapListener implements MapListener, InitializingBean,                                              StreamSource {
private static final String PERSISTENCE_UNIT_NAME = "derby";
private EntityManagerFactory m_entityMgrFactory;
private EntityManager m_entityMgr;
private ObservableMap m_saleEventCache;
private StreamSender m_sender;

public void afterPropertiesSet()
{
m_saleEventCache.addMapListener(this);
}
public void setEventSender(StreamSender sender)
{
m_sender = sender;
}
public void setSaleEventCache(ObservableMap cache)
{
m_saleEventCache = cache;
}
public void entryInserted(MapEvent event)
{
verifyEventInStore(event);
}
private void verifyEventInStore(MapEvent event){
if (!(event.getNewValue() instanceof SaleEvent)){
System.out.println("Unexpected type in SaleEvent cache");
return;
}
if (m_entityMgr==null){
setupEntityMgr();
}
SaleEvent sale = (SaleEvent) event.getNewValue();
Query q = m_entityMgr.createQuery("SELECT s FROM SaleEvent s
WHERE s.itemID = :itemID");
q.setParameter("itemID", sale.getItemID());
List<SaleEvent> saleEvents = q.getResultList();
if (saleEvents.size()==0)
System.out.println("ERROR! Matched SaleEvent not found in store");
else {
System.out.println("Found sale event for " +
saleEvents.get(0).getItemID() + " for $" +
saleEvents.get(0).getSalePrice());
m_sender.sendInsertEvent(sale);
}
}
private void setupEntityMgr() {
m_entityMgrFactory = Persistence.createEntityManagerFactory(
PERSISTENCE_UNIT_NAME);
m_entityMgr = m_entityMgrFactory.createEntityManager();
}
public void entryUpdated(MapEvent event){
verifyEventInStore(event);
}
public void entryDeleted(MapEvent event){
System.out.println("SaleEvent cache entry deleted.
Should not see this event for this sample");
}
}

9.3.2.2 PriceTarget.java

package com.oracle.cep.sample;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class PriceTarget implements java.io.Serializable {
@Id
private String itemID;
private double targetPrice;

public String getItemID() {
return itemID;
}
public void setItemID(String itemID) {
this.itemID = itemID;
}
public double getTargetPrice(){
return targetPrice;
}
public void setTargetPrice(double targetPrice){
this.targetPrice = targetPrice;
}
}

9.3.2.3 PriceTargetLoader.java

package com.oracle.cep.sample;

import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.springframework.beans.factory.DisposableBean;
import com.bea.wlevs.ede.api.InitializingBean;

public class PriceTargetLoader implements DisposableBean, InitializingBean {
private static final String PERSISTENCE_UNIT_NAME = "derby";
static ArrayList<PriceTarget> s_entriesToLoad = new ArrayList<PriceTarget>();
static {
setUpEntriesToLoad();
}

private EntityManagerFactory m_entityMgrFactory;
private EntityManager m_entityMgr;

public void afterPropertiesSet() {
m_entityMgrFactory = Persistence.createEntityManagerFactory(
PERSISTENCE_UNIT_NAME);
m_entityMgr = m_entityMgrFactory.createEntityManager();
m_entityMgr.getTransaction().begin();
try{
Query q = m_entityMgr.createQuery("SELECT t FROM PriceTarget t
WHERE t.itemID = :itemID");
for (PriceTarget target : s_entriesToLoad){
q.setParameter("itemID", target.getItemID());
List<PriceTarget> targetList = q.getResultList();
if (targetList.size()==0){
System.out.println("Persisting target " + target.getItemID());
m_entityMgr.persist(target);
} else {
System.out.println("Found target " + target.getItemID());
}
}
m_entityMgr.getTransaction().commit();
}
finally {
if(m_entityMgr.getTransaction().isActive())
m_entityMgr.getTransaction().rollback();
}
}

public void destroy() {
if(m_entityMgr!=null) {
m_entityMgr.close();
m_entityMgr=null;
}
if(m_entityMgrFactory!=null){
m_entityMgrFactory.close();
m_entityMgrFactory=null;
}
}
private static void setUpEntriesToLoad(){
// 'smith', ipad2, $400
PriceTarget target = new PriceTarget();
target.setItemID("ipad2");
target.setTargetPrice(400);
s_entriesToLoad.add(target);
// 'doe', kindle, $100
target = new PriceTarget();
target.setItemID("kindle");
target.setTargetPrice(100);
s_entriesToLoad.add(target);
// walker, rebel, $400
target = new PriceTarget();
target.setItemID("rebel");
target.setTargetPrice(400);
s_entriesToLoad.add(target);
// williams, lasko1320, $25
target = new PriceTarget();
target.setItemID("lasko1320");
target.setTargetPrice(25);
s_entriesToLoad.add(target);
}
}

9.3.2.4 SaleEvent.java

package com.oracle.cep.sample;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class SaleEvent implements java.io.Serializable {
@Id
private String itemID;
private double salePrice;

public SaleEvent() { }
public SaleEvent(String itemID, double salePrice){
this.itemID = itemID;
this.salePrice = salePrice;
}
public String getItemID(){
return itemID;
}
public void setItemID(String itemID){
this.itemID = itemID;
}
public double getSalePrice(){
return salePrice;
}
public void setSalePrice(double salePrice) {
this.salePrice = salePrice;
}
public String toString() {
return "SaleEvent(" + itemID + ":" + salePrice + ")";
}
}

9.3.2.5 SaleEventsGenerator.java

package com.oracle.cep.sample;

import java.util.Map;
import java.util.Random;
import com.bea.wlevs.ede.api.RunnableBean;
import com.bea.wlevs.ede.api.StreamSender;
import com.bea.wlevs.ede.api.StreamSource;
import com.bea.wlevs.ede.api.InitializingBean;

public class SaleEventsGeneraton implements RunnableBean, StreamSource,
InitializingBean{
private static final int SLEEP_MILLIS = 1000;
private static final String[] s_itemIDs = {
"kodaksport",
"ipodtouch-8GB",
"ipad2",
"kindle",
"garmin1690",
"rebel",
"logitech1080",
"tomtom",
"ipad2",
"cuisinart10s",
"keurig-b70",
"lasko1320" };
private static final double[] s_prices = {
60.0,
200.0,
450.0,
99,
120,
400,
70,
100,
399,
100,
150,
20 };

private boolean m_suspended;
private Thread m_thread;
private StreamSender m_sender;
private Map m_priceTargetCache;

public void setPriceTargetCache(Map cache){
m_priceTargetCache = cache;
}
public void afterPropertiesSet() {
// pre-load PriceTarget cache
for (PriceTarget target : PriceTargetLoader.s_entriesToLoad)
{
System.out.println("Getting : " + target.getItemID());
m_priceTargetCache.get(target.getItemID());
}
}
public void run() {
m_thread = Thread.currentThread();
m_suspended = false;
// send random sale events
Random random = new Random(System.currentTimeMillis());
while (!isSuspended())
{
int index = random.nextInt(s_itemIDs.length);
SaleEvent event = new SaleEvent(s_itemIDs[index], s_prices[index]);
m_sender.sendInsertEvent(event);
try {
synchronized (this) { wait(SLEEP_MILLIS); }
} catch (InterruptedException e) {
if (isSuspended())
return;
}
}
}
public void setEventSender(StreamSender sender) {
m_sender = sender;
}
public synchronized void suspend() {
m_suspended = true;
if (m_thread!=null)
m_thread.interrupt();
}
private synchronized boolean isSuspended() {
return m_suspended;
}
}

10 Webサービス

Webサービス・プラットフォームを使用して、Oracle Stream Analyticsアプリケーションを他のシステムと統合できます。この章では、アプリケーションからのサービスの起動方法、およびアプリケーションのWebサービスとしての公開方法を説明します。

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

- サポート対象のプラットフォーム

- アプリケーションからのWebサービスの起動

- アプリケーションのWebサービスとしての公開

10.1 サポート対象のプラットフォーム

Oracle Stream AnalyticsはJAX-WS 2.0のGlassfish参照実装を使用して、JAX-WS API標準のバージョン2.0をサポートします。

次のものが含まれます。

- JAX-WS 2.0 (Java API for XML Web Services、JSR 224で定義)

- WS-I Basic Profile 1.1

- WS-I Attachments Profile 1.0 (添付ファイル付きのSOAPメッセージ)

- WS-I Simple SOAP Binding Profile 1.0

- SOAP 1.1および1.2 (Simple Object Access Protocol)

- MTOM (メッセージ転送最適化メカニズム)

- WSDL 1.1 (Web Services Definition Language)

- JAXB 2.0 (Java API for XML Binding、個別のJAXBモジュールを介した参照)

- SAAJ 1.3 (SOAP with Attachments API for Java)

10.2 アプリケーションからのWebサービスの起動

このプロシージャでは、Webサービスを起動するアプリケーションの作成方法を説明します。

このシナリオでは、アプリケーションはWebサービス・クライアントです。

アプリケーションからWebサービスを起動するには、次のようにします。

1. WebサービスのためにWeb Service Definition Language (WSDL)ファイルを作成または取得します。

この例ではEchoService.WSDLという名前のWSDLを使用します。

2. Webサービスの起動に必要なコンパイルされたクラス・ファイルを次のコマンドを使用して生成します。コマンド全体を1行で入力します。

java -cp /Oracle/Middleware/my_oep/modules/com.bea.core.ws.glassfish.jaxws.tools_12.0.0.0.jar com.sun.tools.ws.WsImport EchoService.WSDL

3. Oracle Stream AnalyticsアプリケーションのJARファイル内の生成されたクラス・ファイルをアーカイブします。

4. Export-PackageヘッダーおよびパッケージをMANIFEST.MFファイルに追加し、クライアント・コード用のWebサービスJavaパッケージをエクスポートします。

Export-Package: com.oracle.ocep.sample.echoService;

5. Import-Packageヘッダーを使用して、MANIFEST.MFファイルに次のパッケージを追加します。

Manifest-Version: 1.0
Export-Package: echo
Bundle-Vendor: %project.vendor
Bundle-ClassPath: .,lib/echo.jar
Bundle-Version: 1.0.0
Bundle-Localization: bundle
Bundle-ManifestVersion: 2
Bundle-Name: %project.name
Import-Package: com.bea.wlevs.configuration;version="11.1.1",com.bea.w
levs.ede;version="11.1.1",com.bea.wlevs.ede.api;version="11.1.1",com.
bea.wlevs.ede.impl;version="11.1.1",com.bea.wlevs.ede.spi;version="11
.1.1",com.bea.wlevs.management.spi;version="11.1.1",com.bea.wlevs.spr
ing;version="11.1.1",com.bea.wlevs.spring.support;version="11.1.1",co
m.bea.wlevs.util;version="11.1.1",com.ctc.wstx.stax;version="4.0.5",c
om.sun.xml.bind.v2;version="2.1.14",com.sun.xml.bind.v2.model.annotat
ion;version="2.1.14",com.sun.xml.messaging.saaj.soap;version="2.1.0",
com.sun.xml.messaging.saaj.soap.ver1_1;version="2.1.0",javax.jws,java
x.xml,javax.xml.bind,javax.xml.bind.annotation,javax.xml.namespace,ja
vax.xml.transform.stream,oracle.jdbc;version="1.1.0.0_11-2-0-2-0",ora
cle.sql;version="1.1.0.0_11-2-0-2-0",org.apache.commons.logging;versi
on="1.1.0",org.springframework.beans;version="2.5.6",org.springframew
ork.beans.factory;version="2.5.6",org.springframework.beans.factory.c
onfig;version="2.5.6",org.springframework.core.annotation;version="2.
5.6",org.springframework.ejb.config,org.springframework.osgi.context;
version="1.2.0",org.springframework.osgi.extensions.annotation;versio
n="1.2.0",org.springframework.osgi.service;version="1.2.0",org.spring
framework.util;version="2.5.6",org.xml.sax,org.xml.sax.ext,weblogic.j
dbc.extensions;version="1.10.0.0",weblogic.xml.stax;version="1.10.0.0
"

6. Webサービスを起動する次のコード行をアプリケーションに追加します。

EchoService service = new EchoService();
EchoPort port = service.getEchoServicePort();
String echo = port.echo("foo");

10.3 アプリケーションのWebサービスとしての公開

この例では、アプリケーションはWebサービス・プロバイダです。

アプリケーションをWebサービスとして公開するには、次のようにします。

1. WebサービスのためにWSDLを作成または取得します。

この例ではEchoService.WSDLという名前のWSDLを使用します。

2. サービスを実装します。

java.jws注釈の@WebServiceおよび@WebMethodの使用を検討してください。

3. アプリケーション・バンドルにbea-jaxws.xmlファイルを追加します。表10-1では、このファイル内の属性について説明します。

<endpoints>
<endpoint>
<name>EchoService</name>
<implementation-class>
com.bea.wlevs.test.echo.impl.EchoServiceImpl
</implementation-class>
<url-pattern>/echo</url-pattern>
<wsdl-location>
/META-INF/wsdl/echo.wsdl
</wsdl-location>
<service-name>
{http://wsdl.oracle.com/examples/cep/echo}EchoService
</service-name>
<port-name>
{http://wsdl.oracle.com/examples/cep/echo}EchoServicePort
</port-name>
</endpoint>
</endpoints>

表10-1 bea-jaxws.xmlファイルの属性

属性

説明

name

webサービスの名前

implementation-class

サービスを実行するクラス

url-pattern

WebサービスにアクセスするためのURLパターン

wsdl-location

バンドル内のwsdlへの相対パス

service-name

サービスのQName

port-name

ポートのQName

4. BEA-JAXWS-Descriptorヘッダーを使用して、MANIFEST.MFファイルにあるbea-jaxws.xmlファイルを参照します。

BEA-JAXWS-Descriptor: META-INF/bea-jaxws.xml;

5. Import-PackageヘッダーおよびパッケージをMANIFEST.MFファイルに追加し、次のパッケージをアプリケーションにインポートします。

Import-Package: com.ctc.wstx.stax,
com.bea.core.ws.glassfish.jaxws,
com.sun.xml.bind.v2,
com.sun.xml.messaging.saaj.soap,
com.sun.xml.ws,
javax.jws,
javax.xml.bind,
javax.xml.bind.annotation,
javax.xml.namespace,
javax.xml.soap,
javax.xml.transform,
javax.xml.transform.stream,
javax.xml.ws,
javax.xml.ws.spi,
org.xml.sax,
weblogic.xml.stax

6. Oracle Stream Analyticsドメインを示すOracle Stream AnalyticsサーバーのDOMAIN_DIR/config/config.xmlファイルにglassfish-ws要素を追加します。DOMAIN_DIRはドメイン・ディレクトリを示します。

<glassfish-ws>
<name>JAXWS</name>
<http-service-name>JettyServer</http-service-name>
</glassfish-ws>

11 パラメータ化されたアプリケーション

パラメータ化されたアプリケーションには、アプリケーションが起動する前に構成する必要がある特別なパラメータ(変数)が含まれます。通常、パラメータ化されたアプリケーションは、Oracle Stream AnalyticsのEPNシェルを使用してアプリケーションをデプロイするときに構成します。パラメータ化されたアプリケーションは、構成された後、通常のアプリケーションとして機能します。

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

- アプリケーション・パラメータ

- オブジェクト・クラス定義

- 属性の説明

- ターゲット

- metatypeファイルの例

- パラメータ化されたアプリケーションを使用できる場合

- HelloWorldアプリケーションのデプロイ

11.1 アプリケーション・パラメータ

アプリケーション・パラメータは、ユーザーがアプリケーションを起動するときに設定できるプロパティ値を定義します。アダプタ、チャネル、イベントBean、Spring Bean、およびOracle CQLのパラメータ化された問合せ(ビューあり/なし)のプロパティをパラメータ化できます。

アプリケーション・パラメータ(属性)を定義するには、属性定義(AD)をオブジェクト・クラス定義(OCD)にグループ化します。パラメータ化するアプリケーション・コンポーネントごとに1つのOCDを作成します。OCDには、パラメータ化するコンポーネント・プロパティおよびプロンプト・テキストを指定するためのADが1つ以上含まれます。

OCDは、Oracle Stream Analyticsアプリケーション内のOSGI-INF/metatypeディレクトリにあるXMLドキュメント(metatypeファイル)に配置します。このmetatypeファイルは、http://www.osgi.org/xmlns/metatype/v1.1.0/metatype.xsdにある仕様によって定義されるスキーマを使用し、これに準拠しています。

構成例は、metatypeファイルの例を参照してください。

Oracle Stream Analyticsのパラメータ化されたアプリケーションは、http://www.osgi.orgにあるOSGi MetaTypeの仕様に準拠しています。http://felix.apache.org/documentation/subprojects/apache-felix-metatype-service.htmlにあるApache実装を参照してください。

11.2 オブジェクト・クラス定義

すべてのOCDに、name、idおよびdescriptionパラメータが必要です。次の例は、ADがないOCDを示します。

このOCDは、アプリケーション・メタデータを定義していますが、ADがないため、説明は表示されますが、ユーザーには入力が求められません。このタイプのOCDによってアプリケーションが記述されます。

<OCD name="HelloWorld Sample" id="com.oracle.cep.sample.helloworld"
description="The helloworld OEP application is a sample application
for Oracle Event Processing.">
</OCD>

11.3 属性の説明

すべてのADに、name、idおよびdescriptionパラメータが必要です。次の例は、2つのADがあるOCDを示します。

このOCDは、チャネル・コンポーネントの共通定義を提供しており、スレッドの最大数およびチャネルの最大バッファ・サイズに関するパラメータ化された属性(AD)を提供しています。

ユーザーによってアプリケーションが実行されると、指定した説明および他の情報が表示され、要求した情報がユーザーによって入力されて[Return]キーが押されるまで待機します。

<OCD name="Channel Configuration" id="com.oracle.cep.channel"
description="The channel definition in the OCEP Application"
ocep:binding="jmx:EventChannel">
<AD name="Max Threads" id=".maxThreads" type="Integer" required="true"
default="0" min="0" max="100"
description="Number of threads generating messages."
ocep:binding="MaxThreads" />
<AD name="Max Size" id=".maxSize" type="Integer" required="true"
default="0" min="0" max="100"
description="The maximum size of the FIFO buffer for this channel."
ocep:binding="MaxSize" />
</OCD>

注:

エラーを回避するために、常に、metatypeファイル内で最大サイズの前に最大スレッド数を定義してください。

12cリリースの場合、サポートされている唯一のバインディングはJava Management Extension (JMX)です。つまり、AD属性は対応するJMX属性にバインドする必要があります。ターゲットを参照してください。

11.4 ターゲット

OCDおよびアプリケーション・コンポーネントをDesignate要素に接続できます。その後、アプリケーション・クラス定義を複数の指定(同じタイプのコンポーネント)のターゲットにして、定義を再利用できます。

あいまいさを避けるために、各指定を1つのオブジェクト・クラス定義のみに関連付けることができます。

Oracle Stream Analyticsでは、次の指定をサポートします。

- アダプタ、Oracle CQLプロセッサ、イベントBeanまたはSpring Bean。

- 問合せやビューなどのOracle CQLプロセッサ・ルール。ルールの場合、指定IDにより、親コンポーネントとそれに続くサブコンポーネントを識別する必要があります。たとえば、helloworldProcessor:q1です。

Oracle Stream Analyticsでは、afterPropertiesSetライフサイクル・メソッドを呼び出した後、ただし、afterConfigurationActiveライフサイクル・メソッドを呼び出す前に、アプリケーション・コンポーネントにパラメータが割り当てられます。このタイミングにより、アプリケーションがアプリケーション・パラメータを適切なアプリケーション構成として処理し、アプリケーション・パラメータをBeanプロパティと区別できるようになります。

ocep:binding属性により、Oracle Stream Analyticsがパラメータをアプリケーションに割り当てる方法が決定されます。ocep:binding属性をOCDまたはAD内に配置します。これをOCDに配置すると、メタオブジェクトはJMX ObjectInstanceなどの実装オブジェクトにバインドされます。OCDをADに配置すると、メタ属性は、JMX MBean属性などの実装オブジェクトに範囲が設定された実装属性にバインドされます。

11.5 metatypeファイルの例

次のコードは、metatypeファイルの全体を示します。

<MetaData xmlns="http://www.osgi.org/xmlns/metatype/v1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://www.osgi.org/xmlns/metatype/v1.1.0;
http://www.osgi.org/xmlns/metatype/v1.1.0/metatype.xsd">

<OCD name="HelloWorld Sample" id="com.oracle.cep.sample.helloworld"
description="The helloworld OEP application is a sample application
for Oracle Event Processing.">
</OCD>

<OCD name="HelloWorld Channel" id="com.oracle.cep.sample.helloworld.channel" >
<AD name="Max Threads" id="EventChannel.MaxThreads" type="Integer"
required="true" default="0" min="0" max="100"
description="Number of threads generating helloworld messages." />

<AD name="Max Size"     id=".maxSize"     type="Integer"  required="true"
default="0"  min="0" max="100"  description="The maximum size of the FIFO
buffer for this channel." ocep:binding="MaxSize" />
</OCD>

<OCD name="HelloWorld Message Filtering"
id="com.oracle.cep.sample.helloworld.filter" >
<AD name="Filter" id="CQLProcessor.parameters" type="String"
description="Message filter." />
</OCD>

<Designate pid="helloworld"  >
<Object ocdref="com.oracle.cep.sample.helloworld" />
</Designate>

<Designate pid="helloworldInputChannel"  >
<Object ocdref="com.oracle.cep.sample.helloworld.channel" />
</Designate>

<Designate pid="helloworldProcessor.helloworldRule" >
<Object ocdref="com.oracle.cep.sample.helloworld.filter" />
</Designate>
</MetaData>

11.6 パラメータ化されたアプリケーションを使用できる場合

パラメータ化されたアプリケーションは次の3つの方法で使用できます。

- アプリケーションの文書化

- チャネル構成

- Oracle CQLプロセッサの問合せ

11.6.1 アプリケーションの文書化

次の例では、com.oracle.cep.parameterizedappアプリケーションを文書化しています。designate要素のpid属性は、MANIFEST.MFのBundle-SymbolicNameに対応します。

<OCD name="Parameterized App Testing" id="com.oracle.cep.parameterizedapp"
description="The application is for parameterized app testing.">
</OCD>

<Designate pid="parameterizedapp">
<Object ocdref="com.oracle.cep.parameterizedapp" />
</Designate>

11.6.2 チャネル構成

次の例は、ADとOCDを使用してチャネルを構成する方法を示します。designate要素のpid属性は、EPNファイルのチャネル・コンポーネントに対応します。

<OCD name="Channel Configuration" id="com.oracle.cep.channel"
description="The channel definition in the OCEP Application"
ocep:binding="jmx:EventChannel">
<AD name="Max Threads" id=".maxThreads" type="Integer" required="true"
default="0" min="0" max="100"
description="Number of threads generating messages."
ocep:binding="MaxThreads" />
<AD name="Max Size" id=".maxSize" type="Integer" required="true"
default="0" min="0" max="100"
description="The maximum size of the FIFO buffer for this channel."
ocep:binding="MaxSize" />
<AD name="HEARTBEAT" id=".heartbeat" type="Long" required="false"
default="5000000000" min="0" max="100000000000"
description="The value for the heartbeat timeout on this channel.
The default time unit is nanoseconds."
ocep:binding="HeartbeatTimeout" />
</OCD>

<Designate pid="helloworldInputChannel">
<Object ocdref="com.oracle.cep.channel" />
</Designate>

<Designate pid="helloworldOutputChannel">
<Object ocdref="com.oracle.cep.channel" />
</Designate>

11.6.3 Oracle CQL Processorの問合せ

次の例は、Oracle CQLプロセッサの問合せを構成する方法を示します。AD定義は、シーケンスの問合せパラメータ1および2に対応します。

<OCD name="Product Filter" id="com.oracle.cep.solution.product.filter"
ocep:binding="jmx:CQLProcessor" ocep:multi-valued="true">
<AD name="range" id=".range" type="Integer" required="true" min="0"
max="1000000000" default="10"
description="The range scope"
ocep:binding="Parameters" />
<AD name="field" id=".field" type="String" required="true"
default="'remainingQty'"
description="select one field you want to do range controlling"
ocep:binding="Parameters">
<Option label="remainingQty" value="remainingQty" />
<Option label="totalQty" value="totalQty" />
<Option label="price" value="price" />
</AD>
</OCD>

<Designate pid="productProcessor.productRule">
<Object ocdref="com.oracle.cep.solution.product.filter" />
</Designate>

次のとおり、productProcessorを定義するconfig.xmlファイルにprocessor要素を追加します。AD定義は、シーケンスの問合せパラメータ1および2に対応することに注意してください。

<processor>
<name>productProcessor</name>
<rules>
<query id="productRule">
<![CDATA[
IStream (select FROM productInputChannel [RANGE :1 on :2) ]]
>
</query>
</rules>
</processor>

11.7 HelloWorldアプリケーションのデプロイ

次の例では、EPNシェルとともにApache Felix Gogoを使用して、パラメータ化されたHellowWorldアプリケーションをデプロイしています。EPNシェルは、OSGi Bundle Repository (OBR)とのインタフェースを確立し、イントロスペクションを使用して使用可能なメタデータを特定し、ユーザーに適したプロンプトを構成します。

次の例は、EPNシェルを使用してデプロイされている場合のHelloWorldアプリケーションの出力を示します。

注:

パラメータ化されたアプリケーションは、クラスタ化されたドメインではサポートされません。また、デプロイはEPNシェルを介してのみ実行できます。このリリースでは、パラメータ化されたアプリケーション・デプロイメントはOracle JDeveloperまたはOracle Stream Analytics Visualizerでサポートされません。

./startwleves.sh -shell
Oracle CEP Shell (using Apache Felix Gogo)
shell>
shell> deployapp file:///Users/myuserid/helloworld.jar
---- HelloWorld Sample ----
The helloworld OEP application is a sample application for Oracle OEP.
Enter Y/N [default is Y] if you would like to set the parameter "Max Threads" :
-- Application parameter "Max Threads"
--Description : Number of threads generating helloworld messages.
Type: Integer
Default value: 2
Enter value for "Max Threads" or empty for default value :
Using default value of "2".
-- Application parameter "Filter"
--Description : Message filter.
Type: String
Options for parameter "Filter" are :
(0) Select all messages starting with 'Hello'
(1) Select all messages starting with 'Hi'Select option by entering number [0,1] or empty for default value :
<Jan 23, 2012 7:20:40 AM EST> <Notice> <Deployment> <BEA-2045000>
<The application bundle "helloworld" was deployed successfully>
<Jan 23, 2012 7:20:41 AM EST> <Notice> <Spring> <BEA-2047000>
<The application context for "helloworld" was started successfully>
Message: HelloWorld - the current time is:7:20:41 AM
Message: HelloWorld - the current time is:7:20:42 AM

12 インターナショナライゼーション

メッセージ・カタログを使用して、サーバー・ログに送信されるメッセージ・テキストまたはユーザーに対して表示されるメッセージ・テキストをインターナショナライズできます。これらのメッセージは、どのユーザーが特定のアプリケーション・コンポーネントやエラー条件を呼び出したかなど、アプリケーション内で発生した事象に関する情報を提供したり、アプリケーションをリリースする前にデバッグする上で役立ちます。

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

- メッセージ・カタログ

- ローカライゼーション・クラスの生成

12.1 メッセージ・カタログ

メッセージ・カタログは、メッセージのコレクションが格納される単一のXMLファイルです。各メッセージには、一意のIDが付けられます。インターナショナライズするテキストはすべて、メッセージ・カタログで定義および具体化されます。各メッセージ・カタログでは、ログ・メッセージまたはシンプル・テキストのコレクションが定義されます。

メッセージ・カタログを使用すると、アプリケーション・コードを変更または再コンパイルせずにメッセージ文字列を複数のロケールに変換できます。

メッセージIDは、すべてのログ・メッセージまたはロケール・メッセージ・カタログを通じて一意です。メッセージ・カタログ・ファイル内で、各メッセージのローカライズされたバージョンには、エラーを特定する一意のメッセージIDとメッセージ・テキストが割り当てられます。原則的に、メッセージは、サポート担当者が簡単に見つけられるように、システム内の1つの場所からログに記録します。シンプル・テキスト・カタログのメッセージIDは、各シンプル・テキスト・カタログ内で一意です。

メッセージ・カタログには、次の3つのタイプがあります。

- ログ・メッセージ・カタログ: アプリケーションでサーバー・ログに記録される情報メッセージまたはエラー・メッセージ。

- シンプル・テキスト・メッセージ・カタログ: ユーザーに対して表示されるシンプル・メッセージ。

- ロケール・メッセージ・カタログ: 英語版のメッセージが含まれる最上位のログ・メッセージ・カタログまたはシンプル・テキスト・カタログに対応する、ロケール固有のメッセージのコレクション。対応するロケール固有のカタログがあり、追加してサポートされるロケールごとに1つのカタログが付加されます。
最上位の英語版カタログには、メッセージの定義に必要な情報がすべてあります。ロケール固有のカタログには、メッセージID、変更された日付、および特定ロケールに対応するメッセージの変換だけが含まれます。

独自のログ・メッセージまたはシンプル・テキスト・メッセージのカタログを作成し、Oracle WebLogicユーティリティを使用して、ロギング・メソッドを持つJavaクラスを生成できます。Javaクラスをアプリケーション・コードにインポートし、ロギング・メソッドにランタイム値を提供するようアプリケーション・コードを実装します。ロギング・メソッドによって生成されたログ・メッセージは、Oracle Stream Analyticsサーバーによって生成されたログ・メッセージと同じ方法で統合および処理されます。

メッセージ・カタログ・ファイルは次のXMLドキュメント・タイプ定義(DTD)ファイルのいずれかで定義されます。

- msgcat.dtd: 最上位のデフォルト・カタログの構文を記述します。

- l10n_msgcat.dtd: ロケール固有のカタログの構文を記述します。

DTDは、/Oracle/Middleware/wlevserver/modules/ com.bea.core.i18n.generator_VERSION.jarに格納されます。VERSIONは特定のバージョンを表し、これは変更されます。

ロギングのすべての要件に対応するログ・メッセージ・カタログを1つ作成したり、サブシステムまたはJavaパッケージに基づいて細かく分けてカタログを作成することもできます。表示するときにそのログの特定の部分に焦点を当てることができるよう、複数のサブシステム・カタログの使用をお薦めします。シンプル・テキストのカタログの場合は、インターナショナライズされるユーティリティごとに1つのカタログを作成することをお薦めします。

12.1.1 階層

すべてのメッセージは、デフォルトの最上位カタログで定義する必要があります。基本カタログの様々なローカライゼーションを提供するカタログは、ロケールに基づいた名前が付けられたmsgcatのサブディレクトリ(ドイツ語の場合はmsgcat/deなど)に定義されています。たとえば、mycat.xmlという最上位カタログと..de/mycat.xmlというそのドイツ語版のカタログがあります。通常、最上位カタログは英語です。ただし、どのカタログでも英語は必須ではありません。

java.util.Localeのドキュメントで定義されているように、ロケールの指定(deなど)にも階層があります。ロケールでは言語、国、およびバリアントを指定できます。言語は、ロケール指定でもっとも一般的なものです。言語は国コードによって拡張できます。たとえば、en\USはアメリカ英語を示します。これに関連付けられたカタログの名前は、..en\US\mycat.xmlとなります。バリアントはベンダーまたはブラウザに固有であり、言語または国で定義された複数のロケールの間で細かな違い(照合順序など)を持たせるために使用します。

12.1.2 名前付け

メッセージ・カタログ・ファイルの名前(.xml拡張子を除く)は、実行時クラスおよびプロパティ名の生成に使用されるため、命名は慎重に行ってください。メッセージ・カタログに名前を付ける場合、次のガイドラインに従ってください。

- メッセージ・カタログを作成しているターゲット・パッケージ内の既存クラスの名前と競合するようなメッセージ・カタログ名は避けます。

- クラス名に使用できる文字のみが含まれるメッセージ・カタログ名を使用します。

- クラス名の命名規則に従います。

たとえば、カタログの名前がXyz.xmlの場合、生成されるクラス名はXyzLogLocalizerおよびXyzLoggerになります。

以下の考慮事項も、メッセージ・カタログ・ファイルに適用されます。

- ログ・メッセージIDは、通常は先頭に0が付く6文字の文字列です。一部のインタフェースでは、整数表現もサポートされています。

- シンプル・テキスト・カタログのメッセージIDは、任意の文字列値で構成できます。

- Javaでは、パッケージと呼ばれるコレクションにクラスをまとめることができます。パッケージ名は、特定のカタログが存在するサブシステムの名前と一致させることをお薦めします。命名が一環していると、OSGiインポートの定義が容易になります。

- ログのLocalizerクラスは、実際にはResourceBundleプロパティ・ファイルです。

12.1.3 メッセージ引数

ログ・メッセージのメッセージ本文、メッセージ詳細、原因、およびアクションなどのセクションには、java.text.MessageFormatに記載されているようなメッセージ引数を組み込むことができます。メッセージ・コンテンツがjava.text.MessageFormatによって定義されているパターンに準拠していることを確認してください。

引数は、実行時に動的に設定される値を表します。これらの値はルーチン(メッセージを出力するためのルーチンなど)に渡されます。1つのメッセージには0 - 9で番号付けされた10個までの引数をサポートできます。メッセージ本文にはすべての引数を入れる必要がありますが、メッセージ定義(メッセージ本文、メッセージ詳細、妥当な原因)の任意のテキスト・セクションにもこれらの引数の任意のサブセットを入れることができます。

- シンプル・テキスト・メッセージでは、引数を入れられるのは、メッセージ本文のセクションに限られます。

- また、ログ・メッセージでは重大度レベルを割り当てる必要があります。ログ・メッセージはmethod属性で定義されているとおり、生成済のLoggerメソッドによって生成されます。

メッセージ引数は開発時にメッセージ定義に挿入され、実行時においてメッセージがログに記録されるときに適切なメッセージ・コンテンツに置き換えられます。

- 引数はString型であるか、String型として表現可能です。

- 数値データは{n,number}として表されます。

- 日付は{n,date}としてサポートされます。

次に、XMLログ・メッセージ定義の抜粋で、メッセージ引数の使用方法を示します。引数の番号は、method属性で指定された引数の1つと対応している必要があります。具体的には、{0}は最初の引数と、{1}は2番目の引数と対応している必要があります。次の例では、{0}は開けないファイルを表し、{1}は適切に開かれるファイルを表します。

<messagebody>Unable to open file, {0}. Opening {1}. All arguments must be in body.</messagebody>

<messagedetail> File, {0} does not exist. The server will restore the file
contents from {1}, resulting in the use of default values for all future
requests. </messagedetail>

<cause>The file was deleted</cause>

<action>If this error repeats then investigate unauthorized access to the
file system.</action>

次に、 method 属性の例を示します。

-method="logNoFile(String name, String path)"

このメッセージの例では、2つの引数{0}および{1}が使用されています。

- 両方とも<messagebody>で使用されています。

- 両方とも<messagedetail>で使用されています。

- どちらも<cause>または<action>では使用されていません。

12.1.4 フォーマット

最上位のカタログ・ファイルとロケール固有のカタログ・ファイルでは、カタログのフォーマットが異なります。最上位のカタログでは、ベース・ロケールのテキスト・メッセージが定義されます。ロケール固有のカタログは、最上位バージョンで定義されているテキストの翻訳のみを備えています。さらに、ログ・メッセージ・カタログではシンプル・テキスト・カタログと定義の方法が異なります。

ログ・メッセージ・カタログ

この例は、messagebody、messagedetail、cause、およびactionの各要素の使用方法を示すために1つのログ・メッセージを持つMyUtilLog.xmlメッセージ・カタログを示します。

<?xml version="1.0"?>
<!DOCTYPE message_catalog PUBLIC "weblogic-message-catalog-dtd"
"http://www.bea.com/servers/wls90/dtd/msgcat.dtd">
<message_catalog
l10n_package="programs.utils"
i18n_package="programs.utils"
subsystem="MYUTIL"
version="1.0"
baseid="600000"
endid="600100"
<log_message
messageid="600001"
severity="warning"
method="logNoAuthorization(String arg0, java.util.Date arg1,int arg2)"
<messagebody>
Could not open file, {0} on {1,date} after {2,number} attempts.
</messagebody>
<messagedetail>
The configuration for this application will be defaulted to
factory settings. Custom configuration information resides
in file, {0}, created on {1,date}, but is not readable.
</messagedetail>
<cause>
The user is not authorized to use custom configurations. Custom
configuration information resides in file, {0}, created on
{1,date}, but is not readable.The attempt has been logged to
</cause>
the security log.
<action>
The user needs to gain approriate authorization or learn to
live with the default settings.
</action>
</log_message>
</message_catalog>

シンプル・テキスト・カタログ

この例は、1つのテキストが定義されているMyUtilLabels.xmlテキスト・カタログを示します。

<?xml version="1.0"?>
<!DOCTYPE message_catalog PUBLIC "weblogic-message-catalog-dtd"
"http://www.bea.com/servers/wls90/dtd/msgcat.dtd">
<message_catalog>
l10n_package="programs.utils"
i18n_package="programs.utils"
subsystem="MYUTIL"
version="1.0"
<message>
messageid="FileMenuTitle"
<messagebody>
File
</messagebody>
</message>
</message_catalog>

ロケール固有のカタログ

この例は、..\msgcat\fr\MyUtilLabels.xmlファイルにあるメッセージのフランス語版です。

<?xml version="1.0"?>
<!DOCTYPE message_catalog PUBLIC
"weblogic-locale-message-catalog-dtd"
"http://www.bea.com/servers/wls90/dtd/l10n_msgcat.dtd">
<locale_message_catalog
l10n_package="programs.utils"
subsystem="MYUTIL"
version="1.0">
<message>
<messageid="FileMenuTitle">
<messagebody> Fichier </messagebody>
</message>
</locale_message_catalog>

messagebody、messagedetail、cause、およびactionの各要素でテキストを入力するときには、有効なUTF-8 (Unicode Transformation Format-8)文字を生成するツールを使用するとともに、適切なキーボードのマッピングをインストールしておきます。UTF-8は、ASCII文字のエンコーディングを最適化する、効率的なUnicode文字列エンコーディング方式です。メッセージ・カタログでは常にUTF-8エンコーディング方式が使用されます。

12.1.5 メッセージ・カタログのローカライゼーション

カタログ・サブディレクトリの名前は、小文字2文字のISO 639言語コード(日本語はja、フランス語はfrなど)に基づいて付けられます。サポートされている言語コードは、java.util.Locale Javadocで確認できます。

言語コードのバリエーションは、言語コードの下位にある大文字2文字のISO 3166国コードとバリアントを使用して実現できます。一般的な構文は、lang\country\variantです。

たとえば、zhは中国の言語コードです。CNは簡体字中国語の国コードで、TWは繁体字中国語の国コードです。このため、zh\CNおよびzh\TWは中国語の異なる2つのロケールです。

バリアントは、特定のロケールを扱うプラットフォーム・ベンダーの機能に違いがある場合に役立ちます。ベンダー・バリアントには、WIN、MAC、POSIXなどがあります。ロケールをさらに修飾するために2つのバリアントが使用される場合もあります。この場合、バリアントはアンダースコアで区切ります(Traditional_MacとModern_MACなど)。

注:

言語、国、およびバリアントは、すべて大文字/小文字が区別されます。

完全修飾ロケールはzh\TW\WINのようになり、Win32プラットフォームでの繁体字中国語を識別します。前述のロケールをサポートするメッセージ・カタログには、次のファイルが含まれます。

- \*.xml - デフォルト・カタログ

- \zh\*.xml - 中国語ローカライゼーション

- \zh\TW\*.xml - 繁体字中国語ローカライゼーション

- \zh\TW\WIN\*.xml - Win32コード・セットに対する繁体字中国語ローカライゼーション

特定のローカライゼーションは、親ローカライゼーションで定義されたすべてのメッセージに対応する必要はありません。

12.2 ローカライゼーション・クラスの生成

メッセージ・カタログのXMLファイルを作成した後、weblogic.i18ngenユーティリティを使用して、ログ・メッセージ内のテキストをローカライズするLoggerおよびTextFormatterクラスを作成します。weblogic.i18ngenユーティリティにより、メッセージIDのルックアップ・ハッシュ表weblogic.i18n.L10nLookupをロードするi18n_user.propertiesプロパティ・ファイルが作成または更新されます。

エラーや警告などのメッセージはすべてstderrに送信されます。

ユーザー・カタログが認識されるように、i18n_user.propertiesファイルはOracle Stream Analyticsサーバー・クラス・パスで識別されたディレクトリに置く必要があります。i18n_user.propertiesファイルは、Oracle Stream Analyticsサーバー・クラス・パスに置くことをお薦めします。i18n_user.propertiesファイルがtargetdirectoryにある場合は、targetdirectoryがOracle Stream Analyticsサーバー・クラス・パスにある必要があります。

LoggerおよびTextFormatterクラスを生成するためのメッセージ・カタログの解析

次の手順は、Oracle Stream Analyticsサーバーで使用する、インターナショナライズされたメッセージを作成する方法を示します。

1. カタログ内のメッセージを定義して、最上位のログ・メッセージ・カタログまたはシンプル・テキスト・メッセージ・カタログを作成、または編集します。
メッセージ・テキストだけでなく、メッセージが格納するランタイム値の型と配置に関する情報も含みます。

2. weblogic.i18ngenを実行して、手順1で作成または編集したカタログを検証し、LoggerおよびTextFormatterクラスを生成します。

java weblogic.i18ngen [options] [filelist]

生成されたクラスには、各メッセージで使用するメソッドが組み込まれています。このクラスは、メッセージ・カタログ・エントリで指定されたデータに従って定義されます。クラスには、カタログのタイプによって、メッセージ・テキストをロギングまたは取得するメソッドが組み込まれます。クラス名の末尾には、LoggerまたはTextFormatterが付きます。詳細は、「weblogic.i18ngenユーティリティ」を参照してください。

表12-1 weblogic.i18ngenユーティリティ・オプション

オプション

説明

-build

必要なすべてのファイルを生成し、コンパイルします。-i18n、-l10n、-keepgeneratedおよび-compileオプションを兼ね備えています。

-d targetdirectory

生成されたJavaソース・ファイルのルート・ディレクトリを指定します。ユーザー・カタログ・プロパティは、targetdirectoryの相対パスにあるi18n_user.propertiesに配置されます。ファイルは、メッセージ・カタログのi18n_package値およびl10n_package値に基づいて適切なディレクトリに配置されます。デフォルトのターゲット・ディレクトリは現在のディレクトリであり、必要に応じて作成されます。

この引数が省略された場合は、メッセージ・カタログに指定されたクラス階層に関係なく、すべてのクラスがカレント・ディレクトリに生成されます。

-n

解析し、有効性を検証しますが、クラスは生成しません。

-keepgenerated

生成されたJavaソース(クラス・ファイルと同じディレクトリに存在)を保持します。

-ignore

エラーを無視します。

-i18n

インターナショナライザ(Loggers、TextFormattersなど)を生成します。

-l10n

Localizer (LogLocalizers 、TextLocalizersなど)を生成します。

-compile

現在のCLASSPATHを使用して生成されたJavaファイルをコンパイルします。生成されたクラスは、 -d オプションで識別されるディレクトリに配置されます。生成されたクラスは、ソースと同じディレクトリに配置されます。

通常は、コンパイルの途中でエラーが検出されると、クラス・ファイルやプロパティ・ファイルが作成されません。 i18ngen は異常な終了ステータスで終了します。

-nobuild

解析と有効性の検証のみを実行します。

-debug

デバッグ・モード。

-dates

weblogic.i18ngenに、カタログ内のメッセージ・タイムスタンプを更新させます。カタログが書込み可能でタイムスタンプが更新された場合、カタログは上書きされます。

filelist

このファイル・リストのファイルとディレクトリを処理します。ディレクトリが指定されている場合は、そのディレクトリのすべてのXMLファイルが処理されます。すべてのファイルの名前には、XMLの接尾辞が付いている必要があります。すべてのファイルはmsgcat.dtd構文に準拠している必要があります。weblogic.i18ngenは、実際に生成されたファイルに対して、完全修飾名リスト(Javaソース)をstdoutログに出力します。

3. 手順1で作成したメッセージ・カタログ用に、必要に応じてロケール固有カタログを作成します。

4. weblogic.l10ngenを実行して、手順3で作成したロケール固有のカタログを処理します。

5. 手順2で生成したLoggerまたはTextFormatterクラスを使用できるようにアプリケーションをコーディングします。
アプリケーションのMANIFEST.MFファイル内のOSGiインポート文を使用して、次のパッケージをOracle Stream Analyticsアプリケーションにインポートします。

weblogic.i18n.logging weblogic.logging

アプリケーションがLoggerまたはTextFormatterメソッドの1つを呼び出してメッセージをログに記録するか戻すと、メッセージ・テキストのローカライズ・バージョンがターゲット・ロケーションに書き込まれます。Loggerメソッドはローカライズされたログ・ファイルにメッセージのローカライズ・バージョンを書き込み、TextFormatterメソッドはメッセージのローカライズ・バージョンをディスプレイに書き込みます。

6. i18n_user.propertiesファイルがOracle Stream Analyticsサーバー・クラス・パスに配置されていることを確認してください。
weblogic.i18ngenユーティリティにより、メッセージIDのルックアップ・ハッシュ表weblogic.i18n.L10nLookupをロードするi18n_user.propertiesファイルが生成されます。

第II部 デプロイ、テストおよびデバッグ

第II部は、次の章で構成されます。

- アセンブルおよびデプロイ

- テスト1-2-3

- イベントの記録と再生を使用したデバッグ

13 アセンブルおよびデプロイ

Oracle Stream Analyticsアプリケーションをデプロイして実行するには、アプリケーション・ファイルをOSGiバンドルにアセンブルして、そのOSGiバンドルをOracle Stream Analyticsサーバー上のドメインにデプロイします。デプロイされたアプリケーションは、デプロイ先のドメインでクライアント・リクエストを処理します。

アプリケーションのアセンブルおよびデプロイは、Oracle JDeveloperで、Oracle Stream Analytics Visualizerを使用して、手動で行うことができます。この章では、OSGiバンドルにラップされたアプリケーションを手動でアセンブルおよびデプロイする方法について説明します。

アプリケーションのアセンブルおよびデプロイ方法と、Oracle Stream Analytics Visualizerによるアプリケーション・ライブラリのデプロイおよび表示方法の詳細は、『Oracle Stream Analyticsビジュアライザの使用』のアプリケーションのデプロイに関する項を参照してください。

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

- OSGiバンドル

- アプリケーションの依存関係

- アプリケーション・ライブラリ

- デプロイ順序

- 構成履歴

- appCによるOSGiバンドルのアセンブル

- bundle.shによるOSGiバンドルのアセンブル

- OSGiバンドルのデプロイ

13.1 OSGiバンドル

OSGiバンドルには1つ以上のJARファイルが含まれ、そこにOracle Stream Analyticsアプリケーションとそのサービスおよびリソース(依存関係)を定義するJavaクラス、パッケージ、ライブラリが含まれています。

アプリケーションのサービスおよびリソースは、他のバンドルで使用可能にできます。他のバンドル・アプリケーションによって使用されるサービスおよびリソースのみを含むOSGiバンドルを作成することもできます。たとえば、OSGiバンドルには、同じドメインで実行される他のアプリケーションによってアクセスされるJDBCドライバを含めることができます。

アプリケーションとそのリソースを含むOSGiバンドルがアプリケーション・バンドル、リソースのみを含むOSGiバンドルがアプリケーション・ライブラリ・バンドルです。

OSGiアプリケーション・バンドルに含まれるファイルは、次のとおりです。

- イベント・タイプやイベントBeanなど、アプリケーション・コンポーネントを実装したコンパイル済Javaクラス・ファイル。

- コンポーネント構成を含む1つ以上のOracle Stream Analytics構成ファイル。
構成ファイルは、デプロイするOSGiバンドルJARファイルのMETA-INF/wlevsディレクトリに置きます。例: /Oracle/Middleware/my_oep/user_projects/domains/<domain>/<server>/applications/<OSGi_Bundle_Symbolic_Name>。

アプリケーションがすでにドメイン・ディレクトリに存在する場合、構成ファイルはアプリケーション・ファイルと同じディレクトリに展開する必要があります。

- アプリケーションのすべてのコンポーネントと、各コンポーネントが相互にどのように接続されているかを記述したアセンブリ・ファイル。
OSGiバンドルJARファイルのMETA-INF/springディレクトリに、アセンブリ・ファイルを置きます。

- JARのコンテンツを記述するMANIFEST.MFファイル。このファイルを使用して、アプリケーションのリソースを他のバンドルで使用可能にできます。

次のディレクトリ構造に、OSGiアプリケーション・バンドルの構造を示します。

図13-1 OSGiアプリケーション・バンドルの構造

13.2 アプリケーションの依存関係

アプリケーションはインポートしたパッケージおよびライブラリに依存し、パッケージとライブラリは、同じドメインで実行されている他のアプリケーションと共有できます。

OSGiバンドルの依存関係は、MANIFEST-MFで次のように指定します。

- Import-Package属性を使用して、インポートしたパッケージとライブラリをリストします。

- Export-Package属性を使用して、他のOSGiバンドルからアクセスする必要のあるパッケージをリストします。これらのパッケージは、アプリケーションOSGiバンドルにはバンドルされず、またバンドルとともにデプロイもされませんが、Oracle Stream Analyticsサーバーのアプリケーション・ライブラリ・ディレクトリにデプロイされます。

13.3 アプリケーション・ライブラリ

アプリケーション・ライブラリは、同じドメインで実行されている他のアプリケーションでサービスとリソースを使用できるようにします。アプリケーション・ライブラリを使用すると、ドライバや外部ステージなどの機能をアプリケーションに追加できます。

外部ステージとは、別のOracle Stream Analyticsアプリケーションにあるステージです。

アプリケーション・ライブラリは、組込みJARファイルとしてプロジェクトに追加することもできますが、OSGIアプリケーション・ライブラリを使用すると次のような利点があります。

- ライブラリの更新バージョンをデプロイするなど、アプリケーション・アセンブリとメンテナンス活動が容易になります。

- アーティファクトを再利用できます。

- サーバー・ディスク領域使用量を削減できます。

Oracle Stream Analyticsサーバーのアプリケーション・ライブラリは、ライブラリおよびライブラリ拡張ディレクトリにデプロイします。

13.3.1 ライブラリ・ディレクトリ

デフォルトでは、Oracle Stream Analyticsサーバー・ライブラリのディレクトリはDOMAIN_DIR/servername/modulesです。例:

/Oracle/Middleware/my_oep/user_projects/domains/mydomain/myserver/modules

Oracle Stream Analyticsがライブラリ・ディレクトリのライブラリをロードするのは、ライブラリ拡張ディレクトリのコンポーネントより後、Oracle Stream Analyticsアプリケーションより前です。ライブラリがJDBCドライバなどのドライバである場合、正しい順序でアクティブ化されるようにライブラリ拡張ディレクトリに格納する必要があります。

13.3.2 ライブラリ拡張ディレクトリ

デフォルトでは、Oracle Stream Analyticsサーバーのライブラリ拡張ディレクトリはDOMAIN_DIR/servername/modules/extです。次に例を示します。

/Oracle/Middleware/my_oep/user_projects/domains/mydomain/myserver/modules/ext

Oracle Stream Analyticsでは、Oracle Stream Analyticsサーバーのコア・モジュールと同時に、最初にライブラリ拡張ディレクトリのライブラリをロードします。ドライバをアクティブ化して先に古いドライバをオーバーライドする、または別のドライバにアクセスするには、ライブラリ拡張ライブラリにドライバを置きます。ライブラリがドライバでない場合は、ライブラリ・ディレクトリに置きます。

13.4 デプロイ順序

Oracle Stream Analyticsサーバーでは、Oracle Stream Analyticsサーバーの起動時に、次の順序でコンポーネントをロードします。

1. ライブラリ拡張ディレクトリのライブラリをロード。

2. ライブラリ・ディレクトリのライブラリをロード。

3. Oracle Stream Analyticsアプリケーションをロード。

Oracle Stream Analyticsサーバーでは、ライブラリ名の字句順序に基づいて、ライブラリ拡張ディレクトリとライブラリ・ディレクトリの両方からライブラリをロードします。字句順序には、相対ディレクトリ名に加えてJARファイル名も含まれます。次に例を示します。

- modules/a.jarがmodules/b.jarの前に開始されます。

- 字句順序で0/my.jarはmy.jarの前になるため、modules/0/my.jarはmodule/my.jarの前に開始されます。

このルールに従って、単にライブラリ拡張ディレクトリまたはライブラリ・ディレクトリのいずれかの適切に名付けられたサブディレクトリにJARファイルを整理することで、Oracle Stream AnalyticsサーバーがJARファイルをデプロイする順序を制御できます。

アプリケーションをデプロイするとすぐに、Oracle Stream Analyticsサーバーはアプリケーション構成履歴を作成し、構成されたアダプタがイベントのリスニングを開始します。

13.5 構成履歴

Oracle CQLルールまたはOracle Stream Analytics高可用性アダプタ構成に対して行った構成の変更は、履歴に記録されます。

Oracle Stream Analytics Visualizerまたはwlevs.Adminコマンド行ツールを使用して、これらの変更を表示し、ロールバックする(変更を元に戻す)ことができます。

変更履歴をファイルにエクスポートし、そのファイルを使用すると、実行時に行った変更でアプリケーション・ソースを更新できます。詳細は、次を参照してください。

- 『Oracle Stream Analyticsビジュアライザの使用』のアプリケーション構成履歴の管理に関する項

- Oracle Stream Analyticsの管理の構成履歴の管理に関する項

13.6 appCによるOSGiバンドルのアセンブル

appCユーティリティは、アプリケーションを作成、検証、コンパイルできるコマンド行ツールです。

Oracle Stream Analyticsプロジェクトを構成する各種のファイルを作成し、変更できます。appCツールはspring-wlevs-v12_1_3_0.xsd、spring-beans.xsd、spring-osgi.xsdの各スキーマ・バージョンを基準にして検証を行います。このコマンドが機能するようにするには、JDKをインストールする必要があります(Javaコンパイラに依存するため)。

注:

appCツールは、複数のコンポーネント構成ファイルや複数のアセンブリ・ファイルに対応していません。その場合は、bundle.shスクリプトまたはOracle JDeveloperを使用してください。

appCツールは、構成ファイル、アセンブリ・ファイル、および作成されたOSGiバンドルを検証し、Oracle CQL検証と、OSGiバンドルが正常にデプロイされたことを確認します。

注:

現在、appCはスキーマ検証しか実行せず、詳細なセマンティック検証は実行しません。カスタム・アダプタ・プロバイダは検証されません。

appC.jarファイルは、/Oracle/Middleware/my_oep/binにあります。

構文

java -jar appC.jar -cmd [cmd option] -basedir <path to workspace> [arguments]

cmdオプション

-cmd引数を使用して実行するコマンド・オプションを次の中から選択します。

buildAll: テンプレートを作成してマニフェストを生成し、コンポーネント構成ファイルとアセンブリ・ファイルを検証します。

createTemplate: 入力XMLファイルまたはテンプレートXMLファイルを使用してワークスペース・ファイル構造を作成します。

generateManifest: 入力ソース・ファイルをコンパイルし、生成されたクラス・ファイルに基づいてOSGiマニフェスト・ファイルを生成します。

validate: コンポーネント構成ファイルとアセンブリ・ファイルを、そのスキーマに照らして検証します。

引数

-cmd: コマンド・オプションのいずれかを実行します。-basedirでルート・ディレクトリを指定し、プロジェクト・ワークスペースのルートを指定します。

-help: コマンド行のコマンド・オプションと引数について、ヘルプ情報を出力します。

-basedir: appCユーティリティを使用する前に設定するプロジェクト・ワークスペースのルート。

-cp: バンドル・クラスのコンパイルに使用するクラス・パス。

-config: コンポーネント構成ファイルのフル・パス。

-context: アセンブリ・ファイルのフル・パス。

-manifest: オプションの入力マニフェスト・ファイル。マニフェスト・ファイルを指定しない場合は、appCユーティリティによって生成されます。

注:

マニフェストを生成するためにOracle Stream Analyticsで使用される基礎となるBNDパッケージは、リフレクション用法を検索できません。

-name: プロジェクトの名前(OSGiバンドル名)。

-destdir: 出力JARファイルのディレクトリのフル・パス。デフォルトはbasedirです。

-srcdir: ソース・ルート・ディレクトリのフル・パス。

-excludedirs: ソース・ツリーから除外するディレクトリの名前のカンマ区切りリスト。これらのディレクトリは、ソース・ディレクトリ・ルート(srcdir)のサブディレクトリです。

例

入力ソース・ファイルをコンパイルし、OSGi MANIFEST.MFファイルを生成します。

java -jar appC.jar -cmd generateManifest -basedir

テンプレートを作成してMANIFEST.MFファイルを生成し、コンポーネント構成ファイルとアセンブリ・ファイルを検証します。

java -jar appC.jar -cmd buildALL -basedir

13.7 bundle.shによるOSGiバンドルのアセンブル

Oracle Stream Analyticsにはbundler.sh UNIXシェル・スクリプトが用意されており、これを使用するとサービスとパッケージを他のバンドルに提供するOSGiバンドルを手動でアセンブルできます。

たとえば、JDBCドライバをOSGiバンドルJARファイルでデプロイすると、他のOSGiアプリケーションで使用できるようになります。

注:

Windowsサポートはありません(bundler.cmdはありません)。

bundle.shシェル・スクリプトは、ソースJARファイルを読み取り、ターゲットJARファイルを作成します。ターゲットJARファイルには、ソースJARの内容と、適切なバンドル関連エントリを指定したMANIFEST.MFファイルが含まれています。ソース・アーカイブで検出されたすべてのJavaパッケージは、ターゲット・バンドルにエクスポートされます。

bundler.shを使用すると、バンドル・アクティベータも生成できます。バンドル・アクティベータは、JARファイル内の1つ以上のクラスをインスタンス化し、インスタンス化された各オブジェクトをOSGiサービスとして登録します。この機能を利用して、コンポーネント・バンドルは実行時に特定のファクトリ・クラスの複数バージョンにアクセスし、これを操作できます。

OSGiバンドルを手動でアセンブルするには、次の手順に従います。

- ファイルの準備と編成

- MANIFEST.MFファイルの作成

- サードパーティJARファイルの追加

- 外部ステージの参照

- アクティブ化するOSGiバンドルのアセンブル

注:

次に記述したステップの多くを実行できるbuild.xml Antファイルについては、HelloWorldサンプル・ソース・ディレクトリを参照してください。

build.xmlファイルは、Oracle/Middleware/my_oep/ oep/examples/source/applications/helloworldにあります。

13.7.1 ファイルの準備と編成

アプリケーションまたはライブラリをOSGiバンドルに手動でバンドルするには、まずバンドルするファイルの準備と編成が必要です。簡略化のために、この手順では必要なアーティファクトを含む一時ディレクトリを作成し、その後でこの一時ディレクトリのコンテンツをJARファイルに構築します。これが推奨されるアプローチですが、この方法でアプリケーションをアセンブルすることは必須ではありません。

1. outputなどの空のディレクトリを作成します。

prompt> mkdir output

2. すべてのアプリケーションJavaファイルをoutputディレクトリにコンパイルします。

3. output/META-INF/springディレクトリを作成します。

4. アプリケーションのコンポーネントと各コンポーネントの接続が記述されたEPNアセンブリ・ファイルをoutput/META-INF/springディレクトリにコピーします。

5. output/META-INF/wlevsディレクトリを作成します。

6. プロセッサやアダプタなど、アプリケーションのコンポーネントを構成するXMLファイルをoutput/META-INF/wlevsディレクトリにコピーします。

7. バンドルに関する情報を含むMANIFEST.MFファイルを作成します。

MANIFEST.MFファイルの作成を参照してください。

8. Oracle Stream AnalyticsアプリケーションからサードパーティJARファイルにアクセスする必要がある場合は、サードパーティJARファイルの追加を参照してください。

9. outputディレクトリのコンテンツを含むJARファイルを作成します。

デフォルト・マニフェスト・ファイルではなく、必ず前のステップで作成したMANIFEST.MFファイルを指定します。

JARファイルには任意の名前を付けることができます。Oracle Stream Analyticsのサンプルでは、Javaパッケージの名前とバージョンを組み合せた次のようなJARファイル名を使用します。

com.bea.wlevs.example.helloworld_1.0.0.0.jar

サーバーにデプロイされているバンドルを明確にするため、同じようなネーミング・ルールを使用することを検討してください。

10. アプリケーションが外部ステージに依存している場合は、外部ステージの参照を参照してください。

13.7.2 MANIFEST.MFファイルの作成

MANIFEST.MFファイルの構造およびコンテンツはOSGi Frameworkによって指定されます。ファイル内の多くのヘッダーの値はアプリケーションまたはビジネスに固有ですが、多くのヘッダーはOracle Stream Analyticsで必須です。

特に、MANIFEST.MFファイルでは次のものが定義されます。

- アプリケーション名: Bundle-Nameヘッダーで指定されます。

- シンボリック・アプリケーション名: Bundle-SymbolicNameヘッダーで指定されます。
wlevs.AdminユーティリティやJMXサブシステムなど、多くのOracle Stream Analyticsツールは、アプリケーションを参照する場合にバンドルのシンボリック名を使用します。

- アプリケーションのバージョン: Bundle-Versionヘッダーで指定されます。

- インポートされたパッケージ: Import-Packageヘッダーで指定されます。
Oracle Stream Analyticsでは、少なくとも次のパッケージをインポートする必要があります。

Import-Package:
com.bea.wlevs.adapter.defaultprovider;version="11.1.1",
com.bea.wlevs.ede;version="11.1.1",
com.bea.wlevs.ede.api;version="11.1.1",
com.bea.wlevs.ede.impl;version="11.1.1",
org.osgi.framework;version="1.3.0",
org.springframework.beans.factory;version="2.5.6",
org.apache.commons.logging;version="1.1.0",
com.bea.wlevs.spring;version="11.1.1",
com.bea.wlevs.util;version="11.1.1",
org.springframework.beans;version="2.5.6",
org.springframework.util;version="2.0",
org.springframework.core.annotation;version="2.5.6",
org.springframework.beans.factory;version="2.5.6",
org.springframework.beans.factory.config;version="2.5.6",
org.springframework.osgi.context;version="1.2.0",
org.springframework.osgi.service;version="1.2.0"

- エクスポートされたパッケージ: Export-Packageヘッダーで指定されます。このヘッダーは、1つまたは複数のアプリケーション・クラスを、デプロイされている他のアプリケーションと共有する必要がある場合にのみ指定します。一般的な例には、イベントBeanの共有などがあります。
可能な場合は、実装クラス自体のかわりにインタフェースのみが含まれるパッケージをエクスポートします。エクスポートされたクラスが他のアプリケーションで使用中である場合、クラスをエクスポートしているアプリケーションを完全にアンデプロイすることはできません。

エクスポートされたパッケージはサーバー全体で利用されるため、必ずサーバー全体で一意の名前を使用します。

HelloWorldサンプル・アプリケーションのMANIFEST.MFファイルは、次のとおりです。

注:

Oracle WebLogic ServerコンテナBundle-ManifestVersion 2にデプロイするには、Oracle Stream Analyticsで次のMANIFEST.MF設定が必要です。これは、Oracle Stream AnalyticsがOracle WebLogic ServerコンテナでFelixを使用しているためです。

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Version: 1.0.0
Bundle-Vendor: Oracle Corporation
Bundle-Copyright: Copyright (c) 2006-2009 by Oracle.
Export-Package: com.bea.wlevs.event.example.helloworld;version="12.1.2",
com.bea.wlevs.example.helloworld;version="12.1.2"
Import-Package: com.bea.wlevs.configuration;version="12.1.2"
com.bea.wlevs.ede.api;version="12.1.2",
com.bea.wlevs.ede.impl;version="12.1.2",
com.bea.wlevs.ede.spi;version="12.1.2",
com.bea.wlevs.ede;version="12.1.2",
com.bea.wlevs.management.spi;version="12.1.2",
com.bea.wlevs.spring.support;version="12.1.2",
com.bea.wlevs.spring;version="12.1.2",
com.bea.wlevs.util;version="12.1.2",
org.apache.commons.logging;version="1.1.0",
org.springframework.beans.factory.config;version="2.5.6",
org.springframework.beans.factory;version="2.5.6",
org.springframework.beans;version="2.5.6",
org.springframework.core.annotation;version="2.5.6",
org.springframework.osgi.context;version="1.2.0",
org.springframework.osgi.extensions.annotation;version="1.2.0",
org.springframework.osgi.service;version="1.2.0",
org.springframework.util;version="2.5.6"
Bundle-Name: example.helloworld
Bundle-Description: OCEP example helloworld
Bundle-SymbolicName: helloworld

13.7.3 サードパーティJARファイルの追加

Oracle Stream Analyticsアプリケーションの作成時には、既存のサードパーティJARファイル内のレガシー・ライブラリにアクセスする必要がある場合があります。このレガシー・コードへのアクセスを保証するには、次の方法があります。

- Bundle-Classpath

- オペレーティング・システム・パス

- -Xbootclasspath

Bundle-Classpath

Oracle Stream AnalyticsアプリケーションJARファイルにサードパーティJARファイルをパッケージ化することをお薦めします。JARファイルは、任意の場所に保存できます。

注:

このアプローチでは、JARファイルのロード順序をほとんど制御できず、依存関係の競合が発生する可能性があります。このため、Oracle Stream Analyticsサーバー・アプリケーション・ライブラリの使用をお薦めします。

MANIFEST.MFファイルにBundle-Classpathヘッダーを追加し、アプリケーション・クラス・パスを更新することにより、Oracle Stream AnalyticsアプリケーションによるサードパーティJARファイルでのクラスの検出を保証する必要があります。Bundle-Classpathをクラスおよびリソースの検索先となるJARファイル・パス名のカンマ区切りのリストに設定します。バンドル自身を指定するには、ピリオド(.)を使用します。次に例を示します。

Bundle-Classpath: ., commons-logging.jar, myExcitingJar.jar, myOtherExcitingJar.jar

ネイティブ・ライブラリにアクセスする必要がある場合は、ネイティブ・ライブラリもJARファイルにパッケージ化し、MANIFEST.MFファイルのBundle-NativeCodeヘッダーを使用してJARでのその場所を指定する必要があります。

オペレーティング・システム・パス

アプリケーション・ライブラリとしてパッケージすることを選択しないネイティブ・コード・ライブラリに依存するアプリケーション・ライブラリを作成できます。この場合、Oracle Stream Analyticsサーバーのオペレーティング・システム・パス(bootclasspath)にネイティブ・コード・ライブラリを配置できます。サーバーが起動すると、このネイティブ・コードを呼び出す必要があるライブラリ・バンドルがネイティブ・コードをロードします。

-Xbootclasspath

JDBCドライバなどのOracle Stream Analytics,にデプロイされているすべてのアプリケーションで使用されるライブラリがJARファイルに含まれている場合は、サーバー・インスタンスの起動に使用するスクリプト内のjavaコマンドに-Xbootclasspath/aオプションを指定することで、JARファイルをサーバーのブート・クラス・パスに追加できます。

注:

このアプローチでは、JARファイルのロード順序をほとんど制御できず、依存関係の競合が発生する可能性があります。Oracle Stream Analyticsサーバー・アプリケーション・ライブラリの使用をお薦めします。詳細は、オペレーティング・システム・パスを参照してください。

サーバー起動スクリプト名はstartwlevs.cmd (Windows)またはstartwlevs.sh (UNIX)で、スクリプトはドメイン・ディレクトリ内のサーバー・ディレクトリにあります。即時利用可能なサンプル・ドメインはORACLE_CEP_HOME/ocep_11.1/samples/domainsにあり、ユーザー・ドメインはORACLE_CEP_HOME/user_projects/domainsにあります。ORACLE_CEP_HOMEは、d:\oracle_cepなどのOracle Stream Analyticsの主なインストール・ディレクトリです。

13.7.4 -Xbootclasspathを使用したサードパーティJARファイルへのアクセス

wlevs_2.0.jarファイルを実行するjavaコマンドに-Xbootclasspath/aオプションを追加して、起動スクリプトを更新します。システム全体でアクセスするサードパーティJARファイルのフル・パス名に-Xbootclasspath/aオプションを設定します。

たとえば、デプロイされているすべてのアプリケーションからe:\jars\myExcitingJAR.jarというJARファイルにアクセスできるようにする場合は、起動スクリプトのjavaコマンドを次のように更新します。更新箇所を太字で示します(実際には、コマンドは1行に1つにする必要があります)。

%JAVA_HOME%\bin\java -Dwlevs.home=%USER_INSTALL_DIR% -Dbea.home=%BEA_HOME%
-Xbootclasspath/a:e:\jars\myExcitingJAR.jar
-jar "%USER_INSTALL_DIR%\bin\wlevs_2.0.jar" -disablesecurity %1 %2 %3 %4 %5 %6

13.7.5 外部ステージの参照

別のOracle Stream Analyticsアプリケーション内にあるステージを参照できます。別のアプリケーションのステージは、外部ステージと呼ばれます。外部ステージに依存しているアプリケーションをアセンブルするとき、クラス・パス依存関係に注意してください。図13-2に示したアプリケーションの依存関係グラフを考慮してください。

図13-2 外部ステージ依存関係グラフ

この例では、アプリケーションAはアプリケーションBに、アプリケーションBはアプリケーションCに、アプリケーションCはアプリケーションAに依存します。アプリケーションCは、MarketEventクラスを宣言してエクスポートします。アプリケーションAとBは、アプリケーションCによって提供されたMarketEventクラスをインポートします。この例では、OSGiバンドルAとBのMANIFEST.MFファイルにRequire-Bundle: Cが含まれている必要があります。

次の点に注意してください。

- 外部ステージを再デプロイする場合、そのアプリケーションまたは外部ステージに依存するすべての外部ステージを再デプロイする必要があります。
たとえば、アプリケーションBを再デプロイする場合、アプリケーションAを再デプロイする必要があります。

- 1つの外部ステージと他のステージの間にクラス・パスの依存関係がある場合、共有クラスを宣言し、エクスポートする外部ステージをデプロイするときは、共有クラスをインポートするすべての外部ステージを再デプロイする必要があります。
たとえば、アプリケーションCを再デプロイする場合、アプリケーションC (MarketEvent)とクラス・パスの依存関係がアプリケーションAとBも再デプロイする必要があります。

13.7.6 アクティブ化するOSGiバンドルのアセンブル

ファイルの準備と編成が済んだら、bundle.shシェル・スクリプトを使用してそのファイルをOSGiバンドルにアセンブルし、アクティベータ・クラスを定義できます。bundle.shスクリプトは、/Oracle/Middleware/my_oep/binディレクトリにあります。

新しいJDBCドライバのアプリケーション・ライブラリをバンドルする場合、詳細は、Oracle Stream Analyticsの管理のアプリケーション・ライブラリを使用したデータベース・ドライバに関する項を参照してください。

13.7.6.1 コマンドの場所、構文、引数

bundler.shスクリプトは、/Oracle/Middleware/my_oep/binディレクトリにあります。bundler.shコマンドの構文を次に示します。表13-1は、コマンド引数の説明です。

bundler -source JAR -name NAME -version VERSION
[-factory CLASS+] [-service INTERFACE+] [-fragmenthost HOST]
[-stagedir PATH] [-targetdir PATH]
[+import PACKAGE|REGEX+] [-imods REGEX;MODS+] [-import PACKAGE+]
[+export PACKAGE|REGEX+] [-emods REGEX;MODS+]
[-dimport PACKAGE+] [-explode] [-verbose]

表13-1 bundler.shのコマンド行オプション

引数

説明

-source JAR

バンドルするソースJARファイルのパス。

-name NAME

バンドルのシンボリック名。ターゲットJARファイル名のルートは名前の値から導出されています。

-version VERSION

バンドル・バージョン番号。すべてのエクスポートされたパッケージは、この値のバージョン属性で修飾されます。ターゲットJARファイル名には、バージョン番号が含まれています。

-factory CLASS+

OSGiサービスとしてインスタンス化および登録される1つ以上のファクトリ・クラスのスペース区切りリストを指定するオプションの引数。各サービスは、OSGiサービス・レジストリに名前(-name)とバージョン(-version)プロパティとともに登録されます。

この引数は-fragmenthost引数とは互換性がありません。

-service INTERFACE+

各ファクトリ・オブジェクト・サービス登録のオブジェクト・クラスとして使用する1つ以上のJavaインタフェースのスペース区切りリストを指定するオプションの引数。インタフェース名を指定していない場合、または指定したインタフェース数がファクトリ・クラス数と一致していない場合、各ファクトリ・オブジェクトはファクトリ・クラス名で登録されます。

-fragmenthost HOST

結果のバンドルがフラグメント・ハンドルであることを示し、ホスト・バンドルのシンボリック名を指定するオプションの引数。

この引数は-factory引数とは互換性がありません。

-stagedir PATH

ターゲットJARファイル作成時の一時ファイルの書込み先を指定するオプションの引数。

デフォルト: ./bundler.tmp

-targetdir PATH

生成されたバンドルJARファイルの場所を指定するオプションの引数。

デフォルト: 現在の作業ディレクトリ(.)

+import PACKAGE|REGEX+

1つ以上のパッケージ、またはマニフェストImport-Package属性から除外するパッケージを選択するための通常表現のスペース区切りリスト。

デフォルトでは、(java.*を除く)すべての依存パッケージがインポートされます。

-imods REGEX;MODS+

インポート修飾子は通常表現と一致するパッケージに適用されます。

-import PACKAGE

マニフェストImport-Package属性に含まれる追加パッケージ。

指定したインポート修飾子は適用されません。

+export PACKAGE|REGEX+

1つ以上のパッケージ、またはマニフェストExport-Package属性から除外するパッケージを選択するための通常表現のスペース区切りリスト。

デフォルトでは、すべてのバンドル・パッケージがエクスポートされます。

-emods REGEX;MODS+

エクスポート修飾子は通常表現と一致するパッケージに適用されます。

-dimport PACKAGE+

マニフェストDynamicImport-Package属性に含まれる追加パッケージ。

-explode

このオプションのフラグでは、ソースJARの内容のターゲットJARファイルへの移動を指定します。

デフォルトでは、ソースJARはターゲットJARファイル内にネストされ、生成されたバンドル・マニフェストに適切なBundle-Classpath属性に組み込まれます。

-verbose

詳細出力を有効にするオプション・フラグ。

13.7.6.2 OSGiバンドルのアセンブル

1. bundler.shスクリプトを実行して、OSGiバンドルを作成します。コマンドの場所、構文、引数を参照してください。
次のbundle.shコマンドは、bundler.shを使用してOracle JDBCドライバのOSGiバンドルを作成する方法を示しています。

bundler.sh \
-source C:\drivers\com.oracle.ojdbc14_11.2.0.jar \
-name oracle12c \
-version 12.1.3.0 \
-factory oracle.jdbc.xa.client.OracleXADataSource oracle.jdbc.OracleDriver \
-service javax.sql.XADataSource java.sql.Driver \
-targetdir C:\stage

-sourceオプションには、C:\driversディレクトリで見つかるOracleドライバであるJARファイルを指定します。生成されたバンドルJARの名前は、-nameと-version引数(oracle10g_11.2.0.jar)の連結で、C:\stageディレクトリに作成されます。バンドルJARに含まれるファイルは、次のとおりです。

1465 Thu Jun 29 17:54:04 EDT 2006 META-INF/MANIFEST.MF
1540457 Thu May 11 00:37:46 EDT 2006 com.oracle.ojdbc14_11.2.0.jar
1700 Thu Jun 29 17:54:04 EDT 2006 com/bea/core/tools/bundler/Activator.class

-factoryオプションには、バンドルがアクティブ化されるときにOSGiサービスとしてインスタンス化および登録される2つのファクトリ・クラスがあることを指定します。表13-2に示すように、各ファクトリ・クラスは別々のオブジェクト・クラスにあります。

表13-2 ファクトリ・クラスおよびサービス・インタフェース

ファクトリ・クラス

サービス・インタフェース

oracle.jdbc.xa.client.OracleXADataSource

javax.sql.XADataSource

oracle.jdbc.OracleDriver

java.sql.Driver

-serviceオプションでは、nameプロパティをoracle12cに設定し、versionプロパティの値を12.1.3.0に設定してサービスを登録します。次の例は、サービス登録時のOracle Stream Analyticsサーバーのログ・メッセージを示します。

...
INFO: [Jun 29, 2006 5:54:18 PM] Service REGISTERED: { version=12.1.3.0, name=oracle12c, objectClass=[ javax.sql.XADataSource ], service.id=23 }
INFO: [Jun 29, 2006 5:54:18 PM] Service REGISTERED: { version=12.1.3.0, name=oracle12c, objectClass=[ java.sql.Driver ], service.id=24 }
INFO: [Jun 29, 2006 5:54:18 PM] Bundle oracle11g STARTED
...

2. アプリケーション・ライブラリJARを該当するOracle Stream Analyticsサーバー・アプリケーション・ディレクトリにコピーします。

a. バンドルがドライバの場合は、ライブラリ拡張ディレクトリに置きます。
ライブラリ拡張ディレクトリを参照してください。

b. バンドルがドライバでない場合は、ライブラリ・ディレクトリに置くことができます。
ライブラリ・ディレクトリを参照してください。

3. Oracle Stream Analyticsサーバーを停止し、起動します。
Oracle Stream Analyticsの管理のサーバーの起動および停止に関する項を参照してください。

13.8 OSGiバンドルのデプロイ

Oracle Stream AnalyticsアプリケーションまたはライブラリをOSGiバンドルにアセンブルした後、Oracle Stream Analyticsサーバー・ドメインにデプロイします。アプリケーションのデプロイには、Oracle JDeveloper、Oracle Stream Analytics Visualizerおよびデプロイヤ・ユーティリティを使用できます。

この項では、デプロイヤ・ユーティリティの使用方法について説明します。

デプロイヤ・ユーティリティを使用して、スタンドアロンまたはマルチサーバー・ドメインのいずれかにアプリケーションをデプロイできます。グループへのデプロイが可能なのは、サーバーがマルチサーバー・ドメインの一部の場合(クラスタリングが有効の場合)のみです。サーバーがスタンドアロン・サーバー・ドメインの一部の場合(クラスタリングが無効の場合)、グループにはデプロイできません。

Oracle Stream Analyticsは、deployments.xmlファイルを使用して、デプロイ済のOSGiバンドルのリストを内部的に維持します。このファイルは、DOMAIN_DIR/servernameディレクトリにあります。DOMAIN_DIRは、メイン・ドメイン・ディレクトリであり、アプリケーションのデプロイ先となるサーバー・インスタンスに対応します。servernameは、実際のサーバーです。この情報はあくまでも参考として示しています。deployments.xmlファイルを手動で更新することはお薦めしません。

始める前に

アプリケーションをデプロイするOracle Stream AnalyticsインスタンスでJettyが構成されていることを確認してください。詳細は、 Oracle Stream Analyticsの管理のアプリケーション・デプロイメントに関する項を参照してください。

コマンド・ウィンドウを開き、wlevsdeploy.jar JARファイルを含むようにCLASSPATH変数を更新します。このファイルは、次のディレクトリにあります。デプロイヤ・ユーティリティは、JARファイルの中にあります。

/Oracle/Middleware/my_oep/bin

デプロイヤ・ユーティリティを使用してOSGiバンドルをデプロイします。

OSGiバンドルが正常にインストールされ、初期化タスクが完了したら、Oracle Stream Analyticsでアプリケーションが起動され、アダプタ・コンポーネントで着信イベントがリスニングされます。

1. bundle.shによるOSGiバンドルのアセンブルの説明に従って、OSGiバンドルをアセンブルします。

2. コマンド・ウィンドウを開き、次のようにしてデプロイヤ・ユーティリティを実行します。すべて1行で記述してください。

prompt> java -jar wlevsdeploy.jar -url http://host:port/wlevsdeployer
-user user -password password -install application_jar_file

host: Oracle Stream Analyticsサーバーが実行中のコンピュータの名前。

port: Oracle Stream Analyticsがリスニングするポート番号。デフォルト値は9002です。このポートは、Oracle Stream Analyticsドメインが記述されているDOMAIN_DIR/config/ファイルに指定されています。ポート番号は、ファイルの<Netio>要素の<Port>子要素の値です。

<Netio>
<Name>NetIO</Name>
<Port>9002</Port>
</Netio>

user: Oracle Stream Analytics管理者のユーザー名。

password: Oracle Stream Analytics管理者のパスワード。

application_jar_file: OSGiバンドル。OSGiバンドルは、デプロイヤ・ユーティリティが実行される同じコンピュータに置かれている必要があります。たとえば、Oracle Stream Analyticsはホストariel上で実行中で、ポート9002でリスニングしており、管理者のユーザー名とパスワードがwlevs/wlevsであり、アプリケーションJARファイルmyapp_1.0.0.0.jarが/applicationsディレクトリに置かれている場合、コマンドは次のようになります。すべて1行で記述してください。

prompt> java -jar wlevsdeploy.jar -url http://ariel:9002/wlevsdeployer
-user wlevs -password wlevs -install /applications/myapp_1.0.0.0.jar

デプロイヤ・ユーティリティでは、OSGiバンドルの再開、中断、更新、アンインストールや、マルチサーバー・ドメインの指定されたグループへのOSGiバンドルのデプロイなどのためにここで記述する内容について、追加オプションが用意されています。詳細は、Oracle Stream Analyticsの管理のデプロイヤ・ユーティリティを使用したデプロイメント・コマンドに関する項を参照してください。

14 テスト1-2-3

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

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

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

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

- EPNシェル

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Oracle Stream Analyticsには、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 Stream Analyticsアプリケーションに登録されたイベント・タイプに対応するサンプルのデータ・フィード値を含みます。

次の例は、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属性を設定します。

注:

ロード・ジェネレータは、http://www.creativyst.com/Doc/Articles/CSV/CSV01.htmにあるCSV仕様に完全には準拠していません。

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

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

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

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

- name属性portとvalue属性の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 Stream Analyticsサーバーでは、イベント・インスペクタ・サービスを使用しないでください。このサービスは開発中にのみ使用します。

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

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

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

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

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

- http://www.json.org/

- http://code.google.com/p/google-gson

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

14.2.1 イベント・タイプ

イベント・インスペクタ・サービスは、Oracle Stream Analyticsのすべてのイベント・タイプ、すなわち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 Stream Analyticsイベントの名前。

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 Stream Analyticsサーバーの名前。

APPLICATIONNAME: Oracle Stream Analyticsアプリケーションの名前。

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-inspectorのname要素を追加します。

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

次の例に示すように、pubsub-server-nameの値myPubSubは、ローカルのOracle Stream Analyticsサーバー・ファイルで定義された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-inspectorのname要素を追加します。

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

HOST: リモートのOracle Stream Analyticsサーバーのホスト名またはIPアドレス。

PORT: リモートOracle Stream Analyticsサーバー・ファイルで定義されている、リモートOracle Stream Analyticsサーバーのnetioポート。デフォルトは9002です。

PATH: リモートOracle Stream Analyticsサーバー・ファイルで定義されている、http-pubsub要素のpath子要素の値。

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

http://remotehost:9002/pubsub

次の例に示すように、pubsub-server-nameの値myPubSubは、ローカルのOracle Stream Analyticsサーバー・ファイルで定義された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 Stream Analytics Visualizerを使用するか、アプリケーションでコンポーネント構成ファイルを編集して、アプリケーションのデプロイ時または再デプロイ時に設定されるインジェクション設定を指定します。

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

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

たとえば、例に示したコンポーネント構成の一部は、イベント・インジェクション用にプロセッサを構成する方法を示しています。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 Stream Analyticsスキーマ・リファレンスを参照してください。

14.2.5 イベントのトレース

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

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

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

たとえば、例に示したコンポーネント構成の一部は、イベント・トレース用にプロセッサを構成する方法を示しています。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 Stream Analyticsスキーマ・リファレンスのプロセッサに関する項を参照してください。

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

イベント・インスペクタAPIを使用して、イベントをインジェクトおよびトレースします。Oracle Stream Analytics APIに用意されているEventInspectorMBeanインタフェースを実装すると、イベントのトレースおよびインジェクション動作を制御できます。startInject、stopInject、startTraceおよびstopTraceメソッドを呼び出すことができるのは、管理者およびモニター管理者のロールのみです。EventInspectorMBeanインタフェースとそのメソッドの詳細は、Oracle Stream Analytics 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 Stream Analyticsアプリケーション。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 Stream Analyticsサーバーを起動します。

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-typeでMyChannelを作成します。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 Stream Analyticsアプリケーションのリスト、ライブラリのリスト、アプリケーションのインストール、既存のアプリケーションに対するイベントの送信、チャネル・イベントへのサブスクライブ、すべてのパブリック・ステージのリスト、OSGiサービスの取出し、標準Javaメソッドの呼出し、JMX操作の実行、サーバーの停止を行うことができます。

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

g! listapps
com.bea.wlevs.dataservices

Oracle Stream Analyticsライブラリをすべてリストします。次のコマンドは、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

send、insert、updateおよびdeleteの各コマンドを使用するチャネルの完全名を指定して、既存のOracle Stream Analyticsアプリケーションにイベントを送信します。この例では、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 Stream Analytics EPN CQLプログラミング・モデルの上層に位置するJava APIです。JavaアプリケーションでEpnCommandインタフェースを使用すると、EPNコンポーネントを操作できます。

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

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

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

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

14.4.1 セッション変数

セッション変数を設定すると、出力イベントで使用するタイムスタンプ形式を指定できます。タイムスタンプに使用できるのは、FORMATTED、PLAINまたは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();

15 イベントの記録と再生を使用したデバッグ

イベントの記録と再生の機能を使用して、実行中のOracle Stream Analyticsアプリケーションをデバッグできます。アプリケーションの実行中に、EPNコンポーネントから永続ストアにフローするイベントを記録します。後のステージで、イベントBeanなどのアプリケーションでイベントを再生します。イベントBeanでイベントを問い合せ、その結果に基づいてアプリケーションを修正します。

この章のサンプル・コードは、/Oracle/Middleware/my_oep/examples/source/applications/recplayにあるイベントの記録と再生のサンプルからとったものです。サンプルの実行と作成の詳細は、『Oracle Stream Analyticsイベント処理スタート・ガイド』のイベント記録/再生サンプルの実行に関する項を参照してください。

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

- イベント・フロー

- Berkeley DB

- イベントの記録

- イベントの再生

- Berkeley DBの構成

- イベントを記録するコンポーネントの構成

- イベントを再生するコンポーネントの構成

- イベントの記録と再生の開始および終了

15.1 イベント・フロー

次の図は、イベントの記録と再生の例のEPNを示し、どこでイベントを記録でき、どこでイベントを再生できるかを示しています。simpleEventSourceアダプタは、イベントを記録するように構成されています。記録は、アダプタからのイベント・フローとして実行されます。eventStreamチャネルは、イベントを再生するように構成されています。再生は、チャネルへのイベント・フローとして実行されます。

図15-1 EPNでの記録と再生の構成

15.2 Berkeley DB

Berkeley DBは、産業レベルの信頼性や可用性のある、高速でスケーラブルなトランザクション・データベースです。

イベントを記録する場合、Oracle Stream Analyticsサーバーでは、デフォルトで、Oracle Stream Analyticsサーバーにバンドルされた永続イベント・ストアであるBerkeley DBにイベントが格納されます。Berkeley DBの詳細は、次を参照してください。

http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/overview/index.html。

記録と再生の機能を使用するように構成されているアプリケーションをデプロイする場合、Oracle Stream AnalyticsサーバーはBerkeley DBのデータベース・スキーマとインスタンスを次のディレクトリに作成します。

/Oracle/Middleware/my_oep//user_projects/domains/domainname/servername/bdb

注:

データベース・キーは、レコード時間およびシーケンス番号です。

デフォルトBerkeleyデータベース構成はそのままで使用できます。Berkeleyデータベース・インスタンスの位置をカスタマイズしたり、またはパフォーマンスをチューニングする場合のみ、構成を変更する必要があります。Berkeley DBの構成方法の詳細は、Berkeley DBの構成を参照してください。

イベント・ストアAPIを使用して、記録時間の範囲とイベント記録元のコンポーネントを指定することで、ストア内の過去のイベントに対する問合せを実行できます。実際に使用する問合せはイベント・リポジトリ・プロバイダによって異なります。たとえば、Oracle Stream Analyticsに付属のデフォルト永続イベント・ストア・プロバイダではOracle CQLを使用します。これらのAPIを使用してイベント・ストアの古いイベントを削除することもできます。

15.3 イベントの記録

プロセッサ、アダプタ、チャネル、イベントBeanなど、イベントを生成するEPNの任意のコンポーネントの記録を構成できます。プロセッサとチャネルは常にイベントを生成します。

アダプタとイベントBeanは、EventSourceインタフェースを実装する必要があります。

EPNの異なるコンポーネントからのイベントを異なる永続ストアに格納したり、すべてのイベントを同じストアに格納したりするよう構成できます。コンポーネントによって出力されるイベントのみが記録されます。

コンポーネントのイベントの記録を有効にするには、構成ファイルを更新し、record-parameters要素を追加します。record-parametersの子要素を使用して、イベントの記録先となるイベント・ストア、記録が行われる最初の期間、格納するイベント・タイプのリストなどを指定します。

アプリケーションのデプロイが完了し、イベントがネットワーク内で循環を開始すると、特定の開始時間を構成した場合は記録が自動的に開始され、または管理ツールを使用して記録が動的に開始されます。記録が構成された各コンポーネントについて、Oracle Stream Analyticsではコンポーネントを離れたイベントが、記録時のタイムスタンプとともに適切なストアに格納されます。

15.4 イベントの再生

プロセッサ、アダプタ、ストリーム、イベントBeanなど、EPNの任意のコンポーネントの再生を構成できます。一般に、再生コンポーネントはネットワーク内でイベントを記録するステージよりも後のステージです。

コンポーネントのイベントの再生を有効にするには、構成ファイルを更新し、playback-parameters要素を追加します。playback-parametersの子要素を使用して、イベントを再生するイベント・ストア、再生するイベント・タイプのリスト(デフォルトではすべて再生)、再生する記録されたイベントの期間などを指定します。Oracle Stream Analyticsでは、デフォルトで、時間に正確にイベントが再生されます。ただし、イベントが記録元のコンポーネントを離れたときの元の速度よりも速いまたは遅い速度で再生されるように構成できます。

アプリケーションのデプロイが完了し、イベントがネットワーク内で循環を開始すると、Oracle Stream Analytics Visualizerまたはwlevs.Adminを使用して再生を開始する必要があります。Oracle Stream Analyticsでは永続ストアからイベントが読み込まれ、EPNの適切な場所に挿入されます。

コンポーネントが再生イベントを取得した場合は、元のイベントとまったく同じように見えます。イベントを記録するようにダウンストリーム・コンポーネントが構成されている場合、Oracle Stream Analyticsでは着信した再生イベントとリアルタイム・イベントが記録されます。

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

- 『Oracle Stream Analyticsビジュアライザの使用』の再生イベントに関する項

- Oracle Stream Analyticsの管理の再生の制御に関する項

15.5 Berkeley DBの構成

デフォルトBerkeley DB構成はそのままで使用できます。Berkeleyデータベース・インスタンスの位置をカスタマイズしたり、キャッシュ・サイズを設定してパフォーマンスをチューニングする場合のみ、構成を変更する必要があります。

Oracle Stream Analyticsサーバーにイベント・ストアを構成するには、次のようにします。

1. Oracle Stream Analyticsサーバー・インスタンスが実行中の場合には、停止します。

2. サーバーのconfig.xmlファイルを開いて編集します。

ファイルは、/Oracle/Middleware/my_oep/user_projects/ domains/<domain_name>/<server_name>/configにあります。

3. config.xmlファイルのbdb-config要素を編集します。

次の例では、完全に構成済のbdb-config要素を示しています。

<bdb-config>
<db-env-path>bdb</db-env-path>
<cache-size>1000</cache-size>
</bdb-config>

表15-1はbdb-configの子要素の一覧を示します。

表15-1 bdb-configの子要素

子要素

説明

db-env-path

OracleEvent Processingサーバーが、サーバーのconfigディレクトリと相対的にBerkeley DBインスタンスを作成するサブディレクトリを指定します。

デフォルト: bdb

cache-size

Berkeley DBのキャッシュ・エントリに使用可能なメモリー量をバイト単位で指定します。キャッシュ・サイズを調整し、Berkeleyデータベースのパフォーマンスをチューニングできます。キャッシュ・サイズは2の累乗である必要がありますが、そうでない場合は、使用可能なメモリーとパフォーマンスの考慮事項によってのみ制限されます。

デフォルト: je.maxMemoryPercent * JVM最大メモリー

4. Oracle Stream Analyticsサーバーを再起動します。

15.6 イベントを記録するコンポーネントの構成

アプリケーションの任意のプロセッサ、アダプタ、チャネル、またはイベントBeanでイベントの記録を構成できます。

この項では、イベントを記録するアダプタ構成を更新します。詳細は、『Oracle Stream Analyticsスキーマ・リファレンス』のコンポーネント構成に関する項を参照してください。

1. コンポーネント構成ファイルを開き、次のように、イベントの記録を構成するコンポーネントにrecord-parameters子要素を追加します。

<csv-adapter>
<name>StockTradeCSVAdapter</name>
<record-parameters>
...
</record-parameters>
</csv-dapter>

2. record-parametersに子要素を追加して、データ・セット名、格納する1つ以上のイベントのリスト、記録の開始時間と終了時間などを指定します。

<csv-adapter>
<name>StockTradeCSVAdapter/name>
<record-parameters>
<dataset-name>recplay_sample</dataset-name>
<event-type-list>
<event-type>TradeEvent</event-type>
</event-type-list>

<time-range>
<start>2010-01-20T05:00:00</start>
<end>2010-01-20T18:00:00</end>
</time-range>

</record-parameters>
</csv-adapter>

表15-2は指定できるrecord-parametersの子要素の一覧を示します。dataset-nameのみ必須です。

表15-2 record-parametersの子要素

子要素

説明

dataset-name

Berkeley DB: 記録されているデータを識別し、サーバーのconfig.xmlファイルでdb-env-path設定によって指定されているディレクトリの下にあるこの名前のディレクトリに配置します。

Oracle RDBMSベースのプロバイダ: 記録されたイベントを格納する表が作成されるデータベース領域またはスキーマを指定します。Oracle RDBMSベースのプロバイダを構成するには、この要素を指定する必要があります。

event-type-list

Berkeley DB: イベント・ストアに記録されるイベント・タイプを指定します。この要素を指定しない場合、Oracle Stream Analyticsではコンポーネントを離れるすべてのイベント・タイプが記録されます。

Oracle RDBMSベースのプロバイダ: この要素は指定する必要があります。

time-range

記録が行われる期間を指定します。start子要素で開始時間を指定し、end子要素で終了時間を指定して期間を構成します。

開始時間および終了時間を次のXMLスキーマのdateTime値の形式として表します。

yyyy-mm-ddThh:mm:ss

たとえば、記録の開始を2010年1月20日午前5時、終了を2010年1月20日午後6時に指定するには、次のように入力します。

<time-range>
<start>2010-01-20T05:00:00</start>
<end>2010-01-20T18:00:00</end>
</time-range>

XMLスキーマのdateTime形式の完全な詳細は、http://www.w3.org/TR/xmlschema-2/#dateTime-lexical-representation を参照してください。

期間を指定しない場合、アプリケーションをデプロイしてもイベントは記録されず、Oracle Stream Analytics Visualizerまたはwlevs.Adminを使用して明示的に開始するまで記録は行われません。

time-rangeまたはtime-range-offsetを指定できますが、両方は指定できません。

time-range-offset

記録が行われる期間を指定します。start子要素で開始時間を指定し、duration子要素で記録を実行する時間の長さを指定して、期間を構成します。

開始時間を次のXMLスキーマのdateTime値の形式として表します。

yyyy-mm-ddThh:mm:ss

次の形式で期間を表します。

hh:mm:ss

たとえば、記録を2010年1月20日午前5時に開始し、3時間続くように指定するには、次のように入力します。

<time-range-offset>
<start>2010-01-20T05:00:00</start>
<duration>03:00:00</duration>
</time-range-offset>

XMLスキーマのdateTime形式の完全な詳細は、http://www.w3.org/TR/xmlschema-2/#dateTime-lexical-representation を参照してください。

期間を指定しない場合、アプリケーションをデプロイしてもイベントは記録されず、Oracle Stream Analytics Visualizerまたはwlevs.Adminを使用して明示的に開始するまで記録は行われません。

time-rangeまたはtime-range-offsetを指定できますが、両方は指定できません。

batch-size

イベント・バッファからイベント・ストアに書き込むためにOracle Stream Analyticsによって単一のバッチで選択されるイベント数を指定します。

デフォルト値は1000です。

batch-time-out

イベント・ストアに書き込む前に、イベント・バッファ枠がbatch-sizeのイベント数を満たすまでOracle Stream Analyticsが待機する秒数を指定します。

デフォルト値は60です。

max-size

指定した場合、Oracle Stream Analyticsではイベント・ストアへの書込みにストリームが使用され、この要素はストリーム・サイズを指定します。ゼロ以外の値は非同期の書込みを示します。

デフォルト値は1024です。

max-threads

指定した場合、Oracle Stream Analyticsではイベント・ストアへの書込みにストリームが使用され、この要素によって、このストリームのイベントの処理に使用するスレッドの最大数が指定されます。max-sizeが0の場合は、この値の設定に影響はありません。

デフォルト値は1です。

15.7 イベントを再生するコンポーネントの構成

アプリケーションの任意のプロセッサ、アダプタ、チャネル、またはイベントBeanでイベントの再生を構成できます。再生コンポーネントがイベントを受け取って再生できるように、コンポーネントは記録コンポーネントよりダウンストリームにある必要があります。

この項では、イベントを再生するチャネル構成を更新します。

詳細は、『Oracle Stream Analyticsスキーマ・リファレンス』のコンポーネント構成に関する項を参照してください。

1. コンポーネント構成XMLファイルを開き、イベントの再生を構成するコンポーネントにplayback-parameters子要素を追加します。たとえば、チャネルeventStreamを構成する場合は、次のようになります。

<channel>
<name>eventStream</name>
<playback-parameters>
...
</playback-parameters>
</channel>

2. playback-parametersに子要素を追加して、データ・セット、再生する1つ以上のイベントなどを指定します。次に例を示します。

<channel>
<name>eventStream</name>
<playback-parameters>
<dataset-name>recplay_sample</dataset-name>
<event-type-list>
<event-type>SimpleEvent</event-type>
</event-type-list>
</playback-parameters>
</channel>

表15-3は指定できるplayback-parametersの子要素の一覧を示します。dataset-nameのみ必須です。

表15-3 playback-parametersの子要素

子要素

説明

dataset-name

Berkeley DB: 記録されているデータを識別し、サーバーのconfig.xmlファイルでdb-env-path設定によって指定されているディレクトリの下にあるこの名前のディレクトリに配置します。

Oracle RDBMSベースのプロバイダ: 記録されたイベントを格納する表が作成されるデータベース領域またはスキーマを指定します。Oracle RDBMSベースのプロバイダを構成するには、この要素を指定する必要があります。Oracle RDBMSベースのプロバイダを構成するには、この要素を指定する必要があります。

event-type-list

Berkeley DB: イベント・ストアから再生されるイベント・タイプを指定します。この要素を指定しない場合、Oracle Stream Analyticsではすべてのイベント・タイプが再生されます。

Oracle RDBMSベースのプロバイダ: この要素は指定する必要があります。

time-range

開始および終了時間を使用して、再生が行われる期間を指定します。start子要素で開始時間を指定し、end子要素で終了時間を指定して期間を構成します。

開始時間および終了時間を次のXMLスキーマのdateTime値の形式として表します。

yyyy-mm-ddThh:mm:ss

たとえば、再生の開始を2010年1月20日午前5時、終了を2010年1月20日午後6時に指定するには、次のように入力します。

<time-range>
<start>2010-01-20T05:00:00</start>
<end>2010-01-20T18:00:00</end>
</time-range>

XMLスキーマのdateTime形式の完全な詳細は、http://www.w3.org/TR/xmlschema-2/#dateTime-lexical-representation を参照してください。

期間を指定しない場合はアプリケーションをデプロイしてもイベントは再生されず、Oracle Stream Analytics Visualizerまたはwlevs.Adminを使用して明示的に開始するまで再生は行われません。

time-rangeまたはtime-range-offsetを指定できますが、両方は指定できません。

time-range-offset

開始時間と期間を使用して、再生が行われる期間を指定します。start子要素で開始時間を指定し、duration子要素でイベントを再生する時間の長さを指定して、期間を構成します。

開始時間を次のXMLスキーマのdateTime値の形式として表します。

yyyy-mm-ddThh:mm:ss

次の形式で期間を表します。

hh:mm:ss

たとえば、再生を2010年1月20日午前5時に開始し、3時間続くように指定するには、次のように入力します。

<time-range-offset>
<start>2010-01-20T05:00:00</start>
<duration>03:00:00</duration>
</time-range-offset>

XMLスキーマのdateTime形式の完全な詳細は、http://www.w3.org/TR/xmlschema-2/#dateTime-lexical-representation を参照してください。

期間を指定しない場合はアプリケーションをデプロイしてもイベントは再生されず、Oracle Stream Analytics Visualizerまたはwlevs.Adminを使用して明示的に開始するまで再生は行われません。

time-rangeまたはtime-range-offsetを指定できますが、両方は指定できません。

playback-speed

再生速度を正のfloatとして指定します。

デフォルト値は1で、これは通常速度に相当します。値が2の場合、イベントは元の記録速度の2倍の速さで再生されます。0.5の値は、イベントが半分の速度で再生されることを意味します。

repeat

指定された期間の再生が完了した後に、イベントをもう一度再生するかどうかを指定します。

有効な値は、trueおよびfalseです。デフォルト値はfalseです。true値は、意図的に停止されるまで再生が無限に繰り返されることを意味します。Falseの場合はイベントが一度のみ再生されます。

max-size

指定した場合、Oracle Stream Analyticsではイベント・ストアからイベントを再生するとき、ストリームが使用されます。この要素にはストリームのサイズを指定します。ゼロ以外の値は非同期の書込みを示します。

デフォルト値は1024です。

max-threads

指定した場合、Oracle Stream Analyticsではイベント・ストアからイベントを再生するのにストリームが使用されます。この要素には、ストリームのイベントを処理する際に使用するスレッドの最大数を指定します。max-sizeが0の場合は、この値に効果はありません。

デフォルト値は1です。

15.8 イベントの記録と再生の開始および終了

アプリケーションのコンポーネントで記録および再生機能の構成が完了し、Oracle Stream Analyticsにアプリケーションをデプロイすると、構成ファイルで開始および終了の情報を明示的に構成している場合にのみ、サーバーでイベントの記録が開始されます。

たとえば、コンポーネント構成に次の要素が含まれている場合、2010年1月20日午前5時に記録が開始されます。

<time-range>
<start>2010-01-20T05:00:00</start>
<end>2010-01-20T18:00:00</end>
</time-range>

イベントの記録と再生を有効にするには、Oracle Stream Analytics Visualizerまたはwlevs.Adminを使用します。有効にした記録と再生は、構成設定に応じて開始および終了されます。

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

- 『Oracle Stream Analyticsビジュアライザの使用』のイベントの記録と再生に関する項

- Oracle Stream Analyticsの管理の再生の開始に関する項

- Oracle Stream Analyticsの管理の再生の停止に関する項

Visualizerおよびwlevs.Adminでは、管理対象Bean (MBean)を使用して、イベントの記録と再生を動的に開始および終了し、イベント・ストアの構成を管理します。管理対象BeanはJava Management Extensions (JMX)インタフェースを提供するJava Beanです。JMXはネットワーク上のリソースをモニターおよび管理するためのJava EEソリューションです。com.bea.wlevs.management.configuration.StageMBeanを使用することにより、独自の管理ツールを作成し、JMXを使用してイベント・ストア機能を管理できます。

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

- Oracle Stream Analytics Java APIリファレンス

第III部 チューニングとスケーリング

第III部は、次の章で構成されています。

- パフォーマンス・チューニング

- 高可用性アプリケーション

- スケーラブル・アプリケーション

16 パフォーマンス・チューニング

この章では、パーティション化およびバッチ処理を使用してOracle Stream Analyticsアプリケーションのパフォーマンスを向上するための技術について、および高可用性パフォーマンスのチューニングに固有の情報について説明します。

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

- チャネルとJMSのパフォーマンス・チューニング

- 高可用性パフォーマンスのチューニング

16.1 チャネルとJMSのパフォーマンス・チューニング

アプリケーションのパフォーマンスは、イベント・パーティショナ・チャネルの構成、イベントのバッチ処理、受信Java Message Service (JMS)ストリームのパーティション化によってチューニングできます。

イベント・パーティショナ・チャネル: イベント・パーティショナ・チャネルを構成すると、スケーラビリティを向上させることができます。イベント・パーティショナを使用するようにチャネルを構成した場合、受信イベントが到着するたびにチャネルはリスナーを選択し、各リスナーに各イベントをブロードキャストするのではなく、そのリスナーにイベントをディスパッチし、チャネルのイベントをその出力イベント・シンク全体でパーティション化します。

バッチ処理チャネル: デフォルトでは、チャネルはイベントが到達した時点でイベントを処理します。あるいは、wlevs:channel属性batchingをtrueに設定することで、同じタイムスタンプを持ち、同じ問合せからの出力のイベントをまとめてバッチ処理するように構成できます。例は、バッチ処理チャネルを参照してください。

ActiveActiveGroupBeanによるスケーラビリティ。com.oracle.cep.cluster.hagroups.ActiveActiveGroupBeanを使用して、ActiveActiveGroupBeanで作成された通知グループによって、Oracle Event Processingアプリケーションの受信JMSストリームをパーティション化します。詳細は、スケーラブル・アプリケーションを参照してください。

16.2 高可用性パフォーマンスのチューニング

マルチサーバー・ドメインにデプロイするために高可用性アプリケーションを作成するときは、次のパフォーマンス・チューニング・オプションを考慮します。

ホスト構成: 高可用性パフォーマンスを最大限にするために、マルチサーバー・ドメインのすべてのホストが同等の処理能力で構成されており(CPUの数とタイプが類似)、すべてのホストがアプリケーションに必要とされる十分なメモリーとディスクを備えていることを確認してください。

高可用性入力アダプタとサービス品質: Oracle Stream Analyticsの高可用性入力アダプタは、すべての高可用性サービス品質オプションに適用できます。ただし、高可用性入力アダプタはパフォーマンスのオーバーヘッドを増加するため、シンプル・フェイルオーバーおよびバッファリングを使用するシンプル・フェイルオーバーで説明されているような、一部の高可用性サービス品質オプションには適しません。イベントからアプリケーション時間を使用している場合、入力アダプタを使用する必要はありません。パフォーマンスの観点からみた場合、通常はイベントからのアプリケーション時間を使用することをお薦めします。

高可用性入力アダプタの構成: プライマリ・サーバーがイベント・メッセージをブロードキャストするために要する時間とセカンダリ・サーバーがこれらのメッセージを処理するために要する時間を短縮するには、batch-sizeを増加することを考慮します。プライマリ・サーバーが多数のイベントがあるイベント・メッセージをブロードキャストする前に失敗した場合、batch-sizeを増加すると、重複イベントとイベントのミスの可能性が増加します。

ブロードキャスト出力アダプタの構成: プライマリ・サーバーがトリミング・メッセージをブロードキャストするために要する時間と、セカンダリ・サーバーがこれらのメッセージを処理するために要する時間を短縮するには、trimming-intervalを削減します。trimming-intervalが減少すると、新しいプライマリ・サーバーのメモリー内キューが古いプライマリ・サーバーに対して期限切れのためにリカバリ時間が増加する場合があります。

Oracle Coherenceパフォーマンス・チューニング・オプション。高可用性アーキテクチャでOracle Coherenceを構成する場合、次のオプションを考慮します。

- 失敗する前のハートビートの数を削減するには、Oracle Coherenceハートビート・タイムアウトのマシン頻度を増加します。http://download.oracle.com/docs/cd/E15357_01/coh.360/e15723/tune_perftune.htmでOracle Coherence開発者ガイドを参照してください。

- メッセージングのパフォーマンスを向上するには、シリアライズ用にOracle Coherence Portable Object Format (POF)を実装します。POFは言語に依存しないバイナリ形式であり、容量と時間を効率的に使用するよう設計されています。JavaシリアライズのかわりにPOFを使用すると、パフォーマンスが大幅に向上します。

17 高可用性アプリケーション

Oracle Stream Analyticsアプリケーションは常にストリーミング・データを監視するため、高可用性が不可欠です。Oracle Stream Analyticsは、アプリケーション設計パターンと高可用性アダプタによって、アプリケーションのバックアップおよびフェイルオーバー処理の能力を強化します。

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

- Oracle Coherence

- アーキテクチャ

- ライフサイクルとフェイルオーバー

- デプロイメント・グループおよび通知グループ

- 高可用性アダプタ

- 高可用性およびスケーラビリティ

- サービス品質オプションの選択

- 高可用性のためのアプリケーション設計

- 高可用性のサービス品質の構成

- 高可用性アダプタの構成

17.1 Oracle Coherence

Oracle Stream Analyticsの高可用性オプションは、Oracle Coherenceに依存します。Oracle Coherenceを使用せずにOracle Stream Analyticsの高可用性オプションを実装することはできません。

パフォーマンスのチューニングを検討する場合、Oracle Stream Analyticsアプリケーションに加えて必ずOracle Coherenceの構成を評価します。

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

- 高可用性パフォーマンスのチューニング

- Oracle Stream Analyticsの管理のOracle Coherenceに関する項

- 『Oracle Coherenceでのアプリケーションの開発』のOracle Coherenceの構成に関する項

17.2 アーキテクチャ

Oracle Stream Analyticsは、アクティブ・アクティブ高可用性アーキテクチャをサポートします。この方法には、高パフォーマンス、簡素性、およびフェイルオーバー時間の短縮という利点があり、データやサービスの障害が発生する可能性やその影響が緩和されます。

高可用性アプリケーションは、マルチサーバー・ドメインで稼働している複数のOracle Stream Analyticsサーバーのグループにデプロイします。Oracle Stream Analyticsでは、グループ内のサーバーを1つ選択して、アクティブなプライマリ・サーバーに設定します。他のサーバーは、アクティブ・セカンダリ・サーバーとなります。

プライマリ・サーバーおよびセカンダリ・サーバーは、同一の入力イベントを受信するように構成され、それらを並列に処理しますが、プライマリ・サーバーのみがOracle Stream Analyticsアプリケーション・クライアントにイベントを出力します。選択したサービス品質に依存して、セカンダリ・サーバーはインメモリー・キューを使用してそのような出力イベントをバッファリングし、プライマリ・サーバーは、プライマリ・サーバーが出力済のイベントを使用してセカンダリ・サーバーを最新に保ちます。

図17-1に、アクティブ・サーバー1つとプライマリ・サーバー2つの一般的な構成を示します。

図17-1 Oracle Stream Analyticsの高可用性: プライマリ・サーバーおよびセカンダリ・サーバー

17.3 ライフサイクルとフェイルオーバー

図17-2は、Oracle Stream Analytics高可用性ライフサイクルの状態図を示します。この図では、状態名(SECONDARY、BECOMING_PRIMARYおよびPRIMARY)はOracle Stream Analyticsの高可用性アダプタのRuntimeMBeanメソッドのgetStateの戻り値に対応します。このような状態はOracle Stream Analytics専用です。高可用性アダプタの詳細は、高可用性入力アダプタを参照してください。

図17-2 Oracle Stream Analyticsの高可用性ライフサイクルの状態図

初期プライマリ・サーバーを指定することはできません。初期状態では、マルチサーバー・ドメインで起動する第1サーバーがプライマリになるため、特定の順序でサーバーを起動することによって、プライマリの選択に影響を与えることができます。稼働中の特定のサーバーを強制的にプライマリにすることはできません。プライマリが失敗するとバックアップが機能し、現在のプライマリがフェイルオーバーの起動に失敗しないかぎり、二度と自動的にプライマリになりません。

17.3.1 セカンダリの障害

通常、セカンダリ・サーバーに障害が発生しても図17-3に示すようにOracle Stream Analyticsアプリケーションの動作には影響はありません。選択するサービス品質に関係なくイベントの欠落や重複は発生しません。

図17-3 セカンダリの障害

17.3.2 プライマリの障害およびフェイルオーバー

プライマリ・サーバーで障害が発生した場合、図17-4で示すように、選択するサービス品質に応じて、Oracle Stream Analyticsはイベントの欠落や重複を発生させる可能性があるフェイルオーバーを実行します。

図17-4 プライマリの障害およびフェイルオーバー

フェイルオーバー中、Oracle Stream Analyticsは新しいプライマリおよびSECONDARY状態からBECOMING_PRIMARY状態への新しいプライマリの遷移を選択します。選択するサービス品質に依存して、新しいプライマリは構成可能な準備状況のしきい値を満たすまでPRIMARY状態に遷移しません。詳細は、サービス品質オプションの選択にある特定のサービス品質オプションを参照してください。

17.3.3 高可用性マルチサーバー・ドメインの再結合

新しいOracle Stream AnalyticsサーバーがOracle Stream Analytics高可用性マルチサーバー・ドメインに追加されるか、または障害が発生した既存のサーバーが再起動される場合、サーバーでは、デプロイされているすべてのアプリケーションが完全に結合されるまで、Oracle Stream Analytics高可用性デプロイメントと通知グループは完全には結合されません。いつ完全に結合できるかは、アプリケーションの種類によって異なります。

アプリケーションが完全に同一の出力イベントのシーケンスを既存のセカンダリとして出力する必要がある場合(タイプ1アプリケーション)、一部の有限の期間(warm-up-window-lengthの期間)の入力ストリームを処理することによって、アプリケーションはその内部状態を再構築できます。このwarm-up-window-lengthの時間によって、アプリケーションが完全にOracle Stream Analytics高可用性デプロイメントと通知グループを結合するのにかかる最短時間が決定されます。

アプリケーションが完全に同一の出力イベントのシーケンスを既存のセカンダリとして出力する必要がない場合(タイプ2アプリケーション)、warm-up-window-lengthの時間はかからず、アプリケーションはデプロイされたときにOracle Stream Analytics高可用性デプロイメントと通知グループを完全に結合します。

詳細は、適切なwarm-up-window-length時間の選択を参照してください。

17.4 デプロイメント・グループおよび通知グループ

マルチサーバー・ドメイン内のすべてのサーバーは、同一のデプロイメント・グループに属します。デプロイメント・グループは、アプリケーションをデプロイする対象のグループです。Oracle Stream Analyticsの高可用性のために同一のアプリケーションをグループ内のすべてのサーバーにデプロイする必要があります。

デフォルトでは、マルチサーバー・ドメイン内のすべてのサーバーも同一の通知グループに属します。サーバーは、サーバーで障害が発生したとき(およびグループを終了したとき)または動作を再開したとき(およびグループを再結合したとき)を示すメンバーシップ通知用の通知グループとともに、プライマリからの同期通知用の通知グループをリスニングします。

Oracle Stream Analyticsの高可用性アプリケーションのスケールを変更する必要がある場合、ActiveActiveGroupBeanを使用して、すべてのサーバー(プライマリおよびセカンダリ)に広がる単一のデプロイメント・グループの利点を保持する一方で、プライマリ・サーバー・ユニットとして2つ以上のサーバーを機能させることを許可する通知グループを定義します。

マルチサーバー・ドメインのデプロイメント・グループを作成するためには、Oracle Coherenceベースのクラスタリングを使用する必要があります。デフォルト・グループまたはカスタム・グループのいずれかを使用できます。

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

- 高可用性およびスケーラビリティ

- Oracle Coherence

- Oracle Stream Analyticsの管理のカスタム・デプロイメント・グループに関する項を参照してください。

17.5 高可用性アダプタ

Oracle Stream Analytics高可用性を実装するには、高可用性入力アダプタ(オプション)と、高可用性出力アダプタ(必須)をEPNに追加します。

高可用性入力アダプタ

プライマリ・サーバーのオプションの高可用性入力アダプタは、各セカンダリ・サーバーの対応する高可用性入力アダプタと通信し、イベント・タイムスタンプを正規化します。Oracle Stream Analyticsの高可用性によって、高可用性入力アダプタの1つの種類が提供されます。

高可用性入力アダプタを参照してください。

高可用性出力アダプタ

アプリケーションに高可用性の機能を実装するには、EPNで各出力アダプタの前に高可用性出力アダプタを配置します。プライマリ・サーバーの高可用性出力アダプタは、Oracle Stream Analyticsアプリケーションをダウンストリーム・クライアントに接続する出力ストリームにイベントを出力します。

プライマリの高可用性出力アダプタも対応する各セカンダリの高可用性出力アダプタと通信を行い、選択する高可用性のサービス品質に依存して、セカンダリ出力アダプタに出力イベントのインメモリー・キューをトリミングするように命令することができます。

高可用性出力アダプタの詳細は、バッファリング出力アダプタ、ブロードキャスト出力アダプタおよび相関出力アダプタを参照してください。どの出力アダプタを選択するかは、選択する高可用性のサービス品質によって決定されます。サービス品質オプションの選択を参照してください。

図17-5は、定位置にすべての実行可能な高可用性アダプタを持つEPNを簡略化して示しています。この図ではチャネルがなくプロセッサが1つです。

図17-5 EPN内の高可用性アダプタ

17.5.1 高可用性入力アダプタ

各イベントはイベントの発生時点で関連付けられます。イベント・タイムスタンプを生成するには、アプリケーション・タイムスタンプとシステム・タイムスタンプの2つの方法があります(アプリケーション・タイムスタンプとシステム・タイムスタンプの詳細は、チャネルを参照してください)。アプリケーション時間とは、イベントがCQLプロセッサに入る前に、時間値がアプリケーションによって外部で各イベントに割り当てられることを意味します。システム時間とは、CQLプロセッサへの到着時に、時間値がOracle Stream Analyticsによって自動的にイベントに関連付けられることを意味します。

アプリケーション時間は、通常、アプリケーションの高可用性のために必要な最善の選択です。アプリケーション時間は、Oracle Stream Analyticsにイベントが送信される前にイベントに関連付けられるため、アクティブなプライマリおよびセカンダリのインスタンスの全体に渡って整合性があります。システム時間は、システム・クロックが同期されていないことによって、イベントに関連付けられた時間値が各インスタンスで異なる可能性があるためアプリケーションのインスタンスに異なる結果を生成させます。

CQLの問合せが時間ベースのウィンドウを使用しないアプリケーションについては、システム時間を使用しても問題ありません。イベントベースのウィンドウのみ使用するアプリケーションは、受信時間ではなくイベントを受信した順番に依存するためこの場合はシステム時間を使用できます。

時間ベースのウィンドウを使用し、外部で生成された(アプリケーション)タイムスタンプを持たないアプリケーションについては、オプションのOracle Stream Analytics高可用性入力アダプタを使用して、すべてのサーバーで一定の時間値を指定できます。プライマリ・サーバー上の入力アダプタ・インスタンスは、イベントがアダプタに到着した時点でイベントに時間を割り当て(ナノ秒単位)、各イベントに割り当てられた時間値をすべてのセカンダリ・サーバーに転送します。

時間値は、EPN内の任意のダウンストリーム・チャネルにイベントが到着する前に各イベントに割り当てられるため、ダウンストリーム・チャネルは、イベントのチャネル到着時に新しい時間値をイベントに割り当てないようにアプリケーションの時間を使用するように構成する必要があります。

入力イベントは、このアダプタを使用するために各イベントを一意で識別するキーを持つ必要があります。

ハートビート・イベントを送信するように、Oracle Stream Analyticsの高可用性入力アダプタを構成できます。

Oracle Stream Analyticsの高可用性入力アダプタは、すべての高可用性のサービス品質オプションに適用できます。ただし、高可用性入力アダプタはパフォーマンスのオーバーヘッドを増加するため、一部の高可用性サービス品質オプション(シンプル・フェイルオーバーおよびバッファリングを使用するシンプル・フェイルオーバーなど)には適しません。このようなオプションでは、かわりにアプリケーション時間と何らかの着信イベント・プロパティの使用を検討します。

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

- 軽量キュー・トリミング

- JMSによる正確なリカバリ

- 高可用性入力アダプタの構成

17.5.2 バッファリング出力アダプタ

Oracle Stream Analyticsの高可用性バッファリング出力アダプタは、バッファリング型キュー・トリミング方式を実装します。バッファはストリームからの出力イベントのスライディング・ウィンドウです。ウィンドウのサイズはミリ秒単位で測定されます。

Oracle Stream Analyticsの高可用性バッファリング出力アダプタは、シンプル・フェイルオーバーおよび高可用性のサービス品質オプションのバッファリングを使用するシンプル・フェイルオーバーに適用されます。

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

- シンプル・フェイルオーバー

- バッファリングを使用するシンプル・フェイルオーバー

- バッファリング出力アダプタの構成

17.5.3 ブロードキャスト出力アダプタ

Oracle Stream Analyticsの高可用性ブロードキャスト出力アダプタは、分散型キュー・トリミング方式を実装します。アクティブ・プライマリ・インスタンスは、メッセージを通知グループ内のアクティブ・セカンダリ・インスタンスにブロードキャストし、キューのローカル表現をトリミングするタイミングを通知します。

Oracle Stream Analyticsの高可用性ブロードキャスト出力アダプタは、軽量キュー・トリミングの高可用性のサービス品質オプションに適用されます。

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

- 軽量キュー・トリミング

- ブロードキャスト出力アダプタの構成

17.5.4 相関出力アダプタ

Oracle Stream Analyticsの高可用性相関出力アダプタは、通常はJMSから2つのイベント・ストリームを関連付けます。このアダプタは、イベントのインバウンド・バッファと同一イベント・ストリームのセカンド・ソースに関連付け、構成可能な時間間隔の後で相関関係付けに障害が発生する場合にバッファを出力します。関連付けられたイベントは、キューからトリミングされます。関連付けられたイベントは、順序通りに整理されると仮定されます。

Oracle Stream Analyticsの高可用性相関出力アダプタは、JMS高可用性のサービス品質オプションを使用する正確なリカバリに適用されます。

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

- JMSによる正確なリカバリ

- 相関出力アダプタの構成

17.6 高可用性およびスケーラビリティ

Oracle Stream Analytics高可用性アプリケーションのスケールを変更する必要がある場合は、通知グループのSpring BeanであるActiveActiveGroupBeanを使用すると、JMSアプリケーションのスケーラビリティが向上します。

ActiveActiveGroupBeanでは、すべてのサーバー(プライマリおよびセカンダリ)に広がる単一のデプロイメント・グループの利点を保持する一方で、複数のサーバーを1つの高可用性ユニットとして機能させることが可能な通知グループを定義します。

図17-6は、最も単純な構成から高可用性、そして高可能性とスケーラビリティの両方へと至る3つのOracle Stream Analyticsアプリケーションのシナリオを示します。

図17-6 高可用性およびスケーラビリティ

大半のアプリケーションは、高可用性を持たないシングルサーバー・ドメインで起動します。この最も単純なシナリオの場合、1つのOracle Stream Analyticsサーバーで実行されるOracle Stream Analyticsアプリケーションが、1つの入力イベント・ストリームを処理して出力イベントを生成します。

高可用性のシナリオ: アプリケーションがOracle Stream Analytics高可用性オプションを使用するように構成され、2つのサーバーで構成されるマルチサーバー・ドメインのデプロイメント・グループにデプロイされて、プライマリ・サーバーのみがイベントを出力します。

高可用性とスケーラビリティのシナリオ: 高可用性アプリケーションは、通知グループを定義するためにActiveActiveGroupBeanを使用するように構成されます。各通知グループには、単一の高可用性ユニットとして機能する複数のサーバーが含まれます。このシナリオでは、各通知グループ内のプライマリ・サーバーのみがイベントを出力します。通知グループ内のプライマリ・サーバーが停止した場合、Oracle Stream Analytics高可用性フェイルオーバーが発生し、その通知グループ内のセカンダリ・サーバーが新しいプライマリとして宣言されて、構成されているOracle Stream Analytics高可用性のサービス品質に従って、イベントの出力が再開されます。

詳細は、高可用性のあるパーティション化の構成を参照してください。

17.7 サービス品質オプションの選択

欠落イベントおよび複製イベントに対するアプリケーションの許容値と、期待されるイベント・スループットに適するサービス品質オプションを選択します。プライマリ・サーバーおよびセカンダリ・サーバーのハードウェア要件は、サービス品質がより正確になるほど上がるので注意してください。

表17-1に示すサービス品質オプションのいずれかを選択できます。

表17-1 Oracle Stream Analytics高可用性のサービス品質

高可用性オプション

欠落イベント?

重複イベント?

パフォーマンス・オーバーヘッド

シンプル・フェイルオーバー

はい(多数)

はい(少数)

ごくわずか

バッファリングを使用するシンプル・フェイルオーバー

はい(少数)

はい(多数)

低

軽量キュー・トリミング

いいえ

はい(少数)

低-中

JMSによる正確なリカバリ

いいえ

いいえ

高

17.7.1 シンプル・フェイルオーバー

シンプル・フェイルオーバー高可用性のサービス品質は、最低のパフォーマンス・オーバーヘッド(リカバリ時間が速い)および最低のデータ整合性(フェイルオーバー時に欠落イベントと複製イベントの両方の可能性があります)によって特徴付けられます。

プライマリ・サーバーはイベントを出力し、セカンダリ・サーバーは出力イベントのバッファリングを行わないため、その出力イベントを破棄します。現在のアクティブ・プライマリで障害が発生した場合、通知されると新しいアクティブ・プライマリが選択され、出力イベントの送信を開始します。

フェイルオーバー中には、前のプライマリより前または後で稼働しているかに応じて、新しいプライマリによって多くのイベントが欠落したり複製されたりする場合があります。

フェイルオーバー・ウィンドウ中には、イベントが欠落する場合があります。たとえば、1秒当たり100個のイベントを処理してフェイルオーバーに10秒かかる場合、1000個のイベントが欠落します。

新しいプライマリ・サーバーは、ただちにPRIMARY状態に入ります。BECOMING_PRIMARY状態から新しいプライマリ・サーバーが遷移する前に満たす必要がある構成可能な準備状態のしきい値はありません。Oracle Event Processingサーバーがマルチサーバー・ドメインに再結合するとき、セカンダリとしてただちに利用可能になります。

この高可用性のサービス品質を実装するには、各出力アダプタの前に高可用性バッファリング出力アダプタを使用して(サイズがゼロのスライディング・ウィンドウを使用して)EPNを構成します。パフォーマンス・オーバーヘッドを削減するには、高可用性入力アダプタを使用せずに一部の着信イベント・プロパティを持つアプリケーション時間を使用します。

詳細は、シンプル・フェイルオーバーの構成を参照してください。

17.7.2 バッファリングを使用するシンプル・フェイルオーバー

バッファリングを使用するシンプル・フェイルオーバーの高可用性のサービス品質は、低いパフォーマンス・オーバーヘッド(リカバリ時間が速い)および向上したデータ整合性(フェイルオーバー時に欠落イベントはなくても多数の複製イベントの可能性があります)によって特徴付けられます。

プライマリ・サーバーはイベントを出力し、セカンダリ・サーバーはその出力イベントをバッファリングします。現在のアクティブ・プライマリで障害が発生した場合、通知されると新しいアクティブ・プライマリが選択され、出力イベントの送信を開始します。

フェイルオーバー・ウィンドウ中には、イベントが欠落する場合があります。たとえば、1秒当たり100個のイベントを処理してフェイルオーバーに10秒かかる場合、1000個のイベントが欠落します。セカンダリのバッファが大容量の場合、多数の複製が出力される可能性があります。一方、バッファが大容量になるほどメッセージの欠落の可能性は低くなります。

Oracle Stream Analyticsサーバーによりマルチサーバー・ドメインが再結合される際、アプリケーションがOracle Stream Analyticsの高可用性タイプ1アプリケーションである場合(このアプリケーションでは、既存のセカンダリと完全に同一の出力イベントのシーケンスを生成する必要があります)、アプリケーションをセカンダリとして使用可能になるまで、Oracle Stream Analyticsの高可用性出力アダプタに構成したwarm-up-window-lengthの時間待機する必要があります。

この高可用性のサービス品質を実装するには、各出力アダプタの前にサイズがゼロより大きいスライディング・ウィンドウを使用し、高可用性バッファリング出力アダプタを使用してEPNを構成します。パフォーマンス・オーバーヘッドを削減するには、高可用性入力アダプタを使用せずに一部の着信イベント・プロパティを持つアプリケーション時間を使用します。

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

- 適切なwarm-up-window-length時間の選択

- バッファリングを使用するシンプル・フェイルオーバーの構成

17.7.3 軽量キュー・トリミング

この高可用性のサービス品質は、低いパフォーマンス・オーバーヘッド(リカバリ時間が速い)および向上したデータ整合性(フェイルオーバー時に欠落イベントはなくても少数の複製イベントの可能性があります)によって特徴付けられます。

アクティブ・プライマリはセカンダリに通信し、イベントを実際に処理します。これによって、特定の時点でプライマリによって送信されていないイベントのみを含むようにセカンダリは出力イベントのバッファをトリミングできます。イベントは現在のプライマリによって送信された後でのみトリミングされるので、セカンダリによってフェイルオーバーの発生時に任意の出力イベントが欠落しないようにできます。

アクティブ・プライマリがキュー・トリミング・メッセージをアクティブ・セカンダリに送信する頻度は、次のように構成可能です。

- n個のイベントごと(n>0)
これによって、フェイルオーバー時に複製された出力イベントの数を最大n個に限定します。

- nミリ秒ごと(n>0)

キュー・トリミング・アダプタには、アクティブ・プライマリおよびセカンダリの間で統一的にイベントを識別する方法が必要です。お薦めの方法は、イベントを識別するためにアプリケーション時間を使用することですが、一意にイベントを識別する任意のキー値が有効です。

キュー・トリミングの利点は、出力イベントが絶対に欠落しないことです。ただし、通信の必要があるトリミング・メッセージを送信するために、アクティブ・プライマリで若干のパフォーマンス・オーバーヘッドが発生します。このオーバーヘッドは、キュー・トリミング・メッセージの頻度が高くなるほど大きくなります。

フェイルオーバー中には、新しいプライマリがBECOMING_PRIMARY状態に入り、そのイベント・キュー(セカンダリとして累積していく)がフラッシュされるまで、PRIMARY状態には遷移しません。この遷移中には、新しい入力イベントがバッファリングされ、一部の複製イベントが出力される場合があります。

Oracle Stream Analyticsサーバーによりマルチサーバー・ドメインが再結合される際、アプリケーションがOracle Stream Analyticsの高可用性タイプ1アプリケーションである場合(既存のセカンダリと完全に同一の出力イベントのシーケンスを生成する必要があるアプリケーション)、アプリケーションをセカンダリとして使用可能になるまで、Oracle Stream Analyticsの高可用性出力アダプタに構成したwarm-up-window-lengthの時間待機する必要があります。

この高可用性のサービス品質を実装するには、各入力アダプタおよび高可用性ブロードキャスト出力アダプタの後、各出力アダプタの前に、高可用性入力アダプタを使用してEPNを構成します。

詳細は、軽量キュー・トリミングの構成を参照してください。

17.7.4 JMSによる正確なリカバリ

JMSによる正確なリカバリの高可用性のサービス品質は、高パフォーマンス・オーバーヘッド(リカバリ時間が遅い)および最大のデータ整合性(フェイルオーバー時に欠落イベントも複製イベントもありません)によって特徴付けられます。この高可用性のサービス品質は、JMSの入力アダプタおよび出力アダプタにのみ対応します。

JMS高可用性のサービス品質を使用する正確なリカバリでは、シングルサーバーのイベント・パスに伴うトランザクションの保証は重視されず、サーバーのセットからの単一の出力が重視されます。保証を達成するため、セカンダリ・サーバーは、プライマリによってパブリッシュされるイベント・ストリームにJMS経由でリスニングします。図17-7は、この着信イベント・ストリームが、セカンダリが出力キューをトリミングするために使用する信頼できるキュー・トリミング・メッセージのソースであることを示します。JMSが信頼できる転送に構成されている場合、セカンダリで確認されるイベントのストリームは、正確にプライマリによって出力されるイベントのストリームであるため、フェイルオーバーは以前のプライマリ・サーバーによって転送されないイベントを新しいプライマリ・サーバーが正確に出力することを可能にします。

図17-7 JMSによる正確なリカバリ

フェイルオーバー中には、新しいプライマリ・サーバーがBECOMING_PRIMARY状態に入り、そのイベント・キュー(セカンダリとして累積していく)がフラッシュされるまで、PRIMARY状態には遷移しません。この遷移中には、新しい入力イベントがバッファリングされ、複製イベントは出力されません。

Oracle Stream Analyticsサーバーによりマルチサーバー・ドメインが再結合される際、アプリケーションがOracle Stream Analyticsの高可用性タイプ1アプリケーションである場合(このアプリケーションでは、既存のセカンダリと完全に同一の出力イベントのシーケンスを生成する必要があります)、アプリケーションをセカンダリ・サーバーとして使用可能になるまで、Oracle Stream Analyticsの高可用性出力アダプタに構成したwarm-up-window-lengthの時間待機する必要があります。

JMSによる正確なリカバリの高可用性のサービス品質を実装するには、各入力アダプタおよび高可用性相関出力アダプタの後、各出力アダプタの前に、高可用性入力アダプタを使用してEPNを構成します。

スケーラビリティを向上するため、高可用性のサービス品質を持つクラスタ・グループBeanも使用できます。

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

- JMSによる正確なリカバリの構成

- 着信JMSイベント・ストリームのパーティション化

17.8 高可用性のためのアプリケーション設計

高可用性のためのアプリケーションを設計する際には、ここで説明する主なユース・ケース、設計パターン、およびOracle CQL問合せの制約を考慮してください。

Oracle Stream Analyticsの高可用性を宣言的に実装できますが、選択する高可用性のサービス品質から完全に利点を引き出すには、Oracle Stream AnalyticsアプリケーションがOracle Stream Analyticsの提供する高可用性オプションを利用するように設計する必要があります。

17.8.1 プライマリ高可用性のユース・ケース

様々なOracle Stream Analyticsアプリケーション設計に高可用性オプションを適応できますが、一般的に、Oracle Stream Analytics高可用性は、次のユース・ケースを対象に設計されています。

- アプリケーションは1つ以上の外部システムから入力イベントを受信します。

- 外部システムは、パブリッシュ/サブスクライブ・スタイルのシステムで、複数のアプリケーションのインスタンスが同時に接続し、同一のメッセージのストリームを受信することを可能にします。

- アプリケーションは、複数のアプリケーションのコピーが同時に実行される場合、競合が発生しないように外部のシステムを更新しません。

- アプリケーションは、出力イベントを外部のダウンストリーム・システムに送信します。複数のアプリケーションのインスタンスは、一度にメッセージを送信できるアプリケーションのインスタンスは1つのみですが、ダウンストリーム・システムに同時に接続できます。

このような制約では、次の異なるケースが注目されます。

- アプリケーションは、障害の発生時に、一部の出力イベントのダウンストリーム・システムへの送信をスキップすることが許可されます。複製も許可されます。高可用性のサービス品質オプションとしてシンプル・フェイルオーバーを使用します。

- アプリケーションは、複製イベントをダウンストリーム・システムに送信することを許可されますが、障害の発生時に任意のイベントをスキップすることは禁止されます。高可用性のサービス品質オプションとして、バッファリングを使用するシンプル・フェイルオーバーと軽量キュー・トリミングを使用します。

- アプリケーションは、障害の発生中にイベントが送信できない短い一時停止を法として、障害の発生時に完全に同一のメッセージ/イベントのストリームを送信する必要があります。高可用性のサービス品質オプションとしてJMSによる正確なリカバリを使用します。

17.8.2 高可用性の設計パターン

Oracle Stream AnalyticsアプリケーションをOracle Stream Analytics高可用性オプションとともに使用するように設計する場合は、次の設計パターンに従います。

- アプリケーションが許容できる最小の高可用性の選択

- すべての入口/出口ポイントでの高可用性コンポーネントの使用

- 必要なものの保存

- Oracle Stream Analyticsアプリケーション状態の制限

- 適切なwarm-up-window-length時間の選択

- アプリケーションが多重呼出し不変であることの保証

- 外部のソース・イベント・アイデンティティ

- イベント順序の重要性の理解

- 高可用性を考慮したOracle CQL問合せの記述

- サーバーのカップリングの回避

- サーバー・リカバリの計画

17.8.2.1 アプリケーションが許容できる最小の高可用性の選択

正確なリカバリの追加コスト(ステージごとのスループットは減少)がアプリケーションに実際に必要になることを確認してください。

17.8.2.2 すべての入口/出口ポイントでの高可用性コンポーネントの使用

各通常入力アダプタの後に入力アダプタを使用し、各通常出力アダプタの前に高可用性出力アダプタを使用します。

17.8.2.3 必要なものの保存

Oracle Stream Analyticsシステムは、該当する少数のイベントを生成するために問い合せられる多数の生の入力イベントを受信します。通常、該当するイベントは数が少なく、より価値があるという理由から、それらを保存するのが合理的です。

17.8.2.4 Oracle Stream Analyticsアプリケーション状態の制限

Oracle Stream Analyticsシステムを使用すると、イベント・ウィンドウの問合せが可能です。きわめて大きいウィンドウを使用してシステムを構築することは魅力的ですが、障害の発生時に再構築の必要がある状態が増加します。通常、このような技術の高可用性ファシリティを活用するために、長期状態は分散型キャッシュやデータベースのような安定したストレージに保存されるとみなす方が良さそうです。

17.8.2.5 適切なwarm-up-window-length時間の選択

新しいOracle Stream Analyticsサーバーが高可用性マルチサーバー・ドメインに追加されるか、または障害が発生した既存のサーバーが再起動される場合、サーバーでは、デプロイされているすべてのアプリケーションが完全に結合されるまで、Oracle Stream Analytics高可用性デプロイメントと通知グループは完全には結合されません。いつ完全に結合するかは、アプリケーションの種類によって異なります。

Oracle Stream Analyticsの高可用性アプリケーションは、表17-2で示すように、タイプ1またはタイプ2のアプリケーションとして記述できます。

表17-2 Oracle Stream Analytics高可用性アプリケーション・タイプ

アプリケーション・タイプ

出力イベントの完全に同一のシーケンスを生成する必要があるか?

有限の期間内に入力ストリームを処理することによって内部状態を再構築できる必要があるか?

完全に結合する前にこの期間を待機する必要があるか?

タイプ1

はい

はい

はい

タイプ2

いいえ

いいえ

いいえ

詳細は、高可用性マルチサーバー・ドメインの再結合を参照してください。

17.8.2.5.1 タイプ1アプリケーション

タイプ1アプリケーションは、高可用性デプロイメントおよび通知グループに完全に結合すると、新しいセカンダリが既存のセカンダリ・サーバーと完全に同一の出力イベントのシーケンスを生成するように要求します。

タイプ1アプリケーションは、アプリケーションを実行している他のセカンダリ・サーバーと完全に同一の出力イベントのストリームを生成した後で、有限の期間(warm-up-window-lengthの時間)にその入力ストリームを処理することによって、内部状態を再構築する必要があります。

高可用性出力アダプタ上で、warm-up-window-lengthの時間を構成します。warm-up-window-lengthの時間の長さは、秒または分単位で指定します。たとえば、アプリケーションに5分、7分、15分の範囲をベースとするウィンドウを持つOracle CQL問合せが含まれる場合、最小のwarm-up-window-length時間は15分(最大の範囲をベースとするウィンドウ・サイズ)となります。Oracleは、必要な状態が利用可能であることを保証するために数分の値を持つ最大ウィンドウ長もお薦めします。そのため先の例では17分または20分がwarm-up-window-length時間に適した長さとなります。

サーバーは、warm-up-window-lengthの期間中はシステム時間を使用するため、サーバー時間は処理中のイベントに関連したアプリケーション時間には直接関連付けられません。

タイプ1アプリケーションは、有限の期間中に発生したイベントのみを対象とします。すべての範囲をベースとするOracle CQLウィンドウは、warm-up-window-length時間よりも短縮する必要があり、タプルベースのウィンドウが時間によって条件を付けられる必要があります。たとえば、アプリケーションは、直近の10個のイベントが直近の5分間に発生した場合、それらのイベントのみを問い合せます。このプロパティを持たないアプリケーションは、タイプ1アプリケーションではありえずwarm-up-window-lengthの期間を使用できません。

たとえば、時間の条件を持たないタプルベースでパーティション化されたウィンドウを使用するアプリケーションは、任意の時間量がウィンドウの状態の再構築に必要となるためwarm-up-window-lengthを使用できません。

タイプ1アプリケーションが高可用性ブロードキャスト出力アダプタを使用する場合、一意のアプリケーション専用キーまたはアプリケーション時間のようなモノトニックなキーを使用することによって、イベントをトリミングできます。アプリケーション時間を使用してイベントをトリミングすることは、出力イベントが生成されない可能性があるアプリケーションにおいて、堅牢性が増すとともに不具合への脆弱性が低下するためお薦めです。

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

- Oracle CQLの問合せの制約

- バッファリング出力アダプタ

- ブロードキャスト出力アダプタ

- 相関出力アダプタ

17.8.2.5.2 タイプ2アプリケーション

タイプ2アプリケーションは、高可用性デプロイメントおよび通知グループに完全に結合すると、新しいセカンダリ・サーバーが既存のセカンダリ・サーバーと同一の出力イベントのシーケンスを生成するように要求しません。新しいクラスタ・メンバーが、入力イベントの処理を開始する時点に関して有効な出力イベントを生成するように要求するのみです。

タイプ2アプリケーションはwarm-up-window-length期間を要求しません。

大半のアプリケーションは、タイプ2アプリケーションです。アプリケーションが任意の時点で(プライマリOracle Stream Analyticsサーバー上で)起動し、その時点で入力ストリームからイベントの処理を開始して、有効な出力イベントを生成することが多くあります。アプリケーションの起動中は入力ストリームが一時停止されず、入力イベントは常に生成されて受信します。多くの場合、若干異なるタイミングで同じ処理を実行するセカンダリ・ステージでも、アプリケーションの観点から見れば有効な出力イベントが生成されると想定できますが、タイミングのわずかな違いのために、プライマリ・サーバーによって生成されるイベントと同一とはかぎりません。

たとえば、金融市場が開いている間のみ実行される金融アプリケーションは、次のようにタイプ2のアプリケーションとして動作できます。すべてのサーバーは市場が開く前に起動し、市場データ・ストリームにおける同じ時点で着信イベントの処理を開始します。障害に備えるために複数のセカンダリ・サーバーを実行できますが、市場が開いている間セカンダリ・サーバーの数が十分な場合には、障害が発生するセカンダリ・サーバーを再起動したり、セカンダリ・サーバーを追加しないでください。これは、どのセカンダリ・サーバーも状態をリカバリする必要がないためです。

17.8.2.6 アプリケーションが多重呼出し不変であることの保証

異なるサーバー上でアプリケーションの2つのコピーを実行でき、そのコピーは共有されたキャッシュやデータベースで競合しません。外部のリレーション(キャッシュや表など)を使用する場合、サーバーがクラスタに再結合するとき、アプリケーションは以前と同一のキャッシュや表にアクセスします。アプリケーションは同一の外部リレーションに再結合する必要があります。データが必ず同一のデータ・ソースから抽出されるように、サーバー上のデータ・ソースは変更しないでください。

17.8.2.7 外部のソース・イベント・アイデンティティ

多くの高可用性ソリューションでは、異なるサーバー間でイベントの関連付けが必要です。イベントを関連付けるには、イベントをユニバーサルに識別可能にする必要があります。イベントをユニバーサルに識別可能にする最適な方法は、外部情報、可能であればタイムスタンプを使用してイベントにシードすることです。詳細は、アプリケーション時間の優先を参照してください。

17.8.2.8 イベント順序の重要性の理解

プライマリおよびセカンダリのサーバーは、キュー・トリミングおよび同等ベースのイベント識別子(継続的に増加しない、モノトニックではないイベント識別子)を使用する高可用性のサービス品質オプションを選択する場合、同一の出力イベントを完全に同一の順序で生成する必要があります。異なる順序で出力イベントを生成すると、障害の発生時に出力イベントが欠落したり、出力イベントが不要に重複したりする可能性があります。

図17-8で示される出力イベント・ストリームを検討してください。プライマリ・サーバーは、出力イベントa、b、およびcを持ちます。イベントcを出力後、プライマリはセカンダリにキュー・トリミング・メッセージを送信します。

図17-8 イベント順序

セカンダリ・サーバーは、イベントc自体を含むイベントcの前に生成されたキュー内のすべてのイベントをトリミングします。この場合、イベント・セットは{a, b, e, d, c}となり、これらはプライマリ・サーバーがイベントdおよびeをまだ出力していないため適切ではありません。イベントcのトリミング・メッセージの処理後にフェイルオーバーが発生する場合、イベントは失われます。

17.8.2.8.1 確定的動作の優先

複数のインスタンス上で実行される場合、アプリケーションが同一の順序でイベントを生成するためには、確定している必要があります。アプリケーションは次の要素に依存させないでください。

- 異なるマシン上に異なる結果を返す可能性がある乱数ジェネレータ。

- System.getTimeMillisまたはSystem.nanoTimeなどのメソッド。これらはシステム・クロックが同期されていないため、異なるマシン上で異なる結果を返す可能性があります。

17.8.2.8.2 マルチスレッドの回避

スレッド・スケジューリング・アルゴリズムは時間への依存度がきわめて高いため、マルチスレッドはアプリケーション内で非確定的なソースとなります。異なるスレッドは、異なるマシン上および異なる時間でスケジューリングできます。

たとえば、複数のスレッドが高可用性アダプタに並列にイベントを送信するEPNを作成しないでください。そのようなチャネルが高可用性アダプタのイベント・ソースの場合、イベントが異なるスレッドごとに並列にアダプタに送信されるようになり、イベント順序を非確定的にすることができる可能性があります。また、複数のスレッドを持つメディエータ(JMSサーバー)はイベントを送信しないでください。このメディエータはイベント・ソースとして機能します。

避ける必要があるチャネル構成に関する詳細は、次を参照してください。

- 『Oracle Stream Analyticsのカスタマイズ』の構成ファイルの要素およびプロパティに関する項

- Oracle Stream Analyticsスキーマ・リファレンスのmax-threads

17.8.2.8.3 モノトニックなイベント識別子の優先

イベント識別子はモノトニックまたは非モノトニックにできます。モノトニックな識別子は、継続的に増加する識別子です(時間値など)。非モノトニックな識別子は、継続的に増加せず、重複を含む可能性があります。

通常、アプリケーションの設計時にはモノトニックなイベント識別子を指定します。モノトニックなイベント識別子を使用すると、Oracle Stream Analyticsの高可用性アダプタは順序どおりでないイベントを生成する可能性があるアプリケーションを処理できます。

17.8.2.9 高可用性を考慮したOracle CQL問合せの記述

Oracle Stream Analytics高可用性を使用する際に、Oracle CQL問合せのすべての使用方法がサポートされるわけではありません。この制約を解決するには、Oracle CQLの問合せを再定義する必要があります。詳細は、Oracle CQLの問合せの制約を参照してください。

17.8.2.10 サーバーのカップリングの回避

Oracle Stream Analyticsシステムで高可用性のパフォーマンスが最も高くなるのは、サーバーが調整を必要とせずに実行できるときです。通常、共有状態が存在せず、ダウンストリーム・システムが複製を許容する場合にこれは実行できます。高可用性のレベルを上げることは、ダウンストリーム・システムが確認するイベント・ストリームの忠実度を上げることを目標としますが、忠実度を上げることはパフォーマンスのペナルティを伴います。

17.8.2.11 サーバー・リカバリの計画

セカンダリ・サーバーがマルチサーバー・ドメインに再結合するときには、現在のプライマリとアクティブ・セカンダリが一致するようにアプリケーション状態を再構築する時間が必要です。適切なwarm-up-window-length時間の選択を参照してください。

マルチサーバー・ドメインに再結合した後に、セカンダリ・サーバーがアクティブ・セカンダリ・サーバーとして利用可能になるためにかかる時間が、要求するアクティブ・セカンダリ・サーバーの数における要因となります。

準備完了前にセカンダリが新しいプライマリ・サーバーになることを宣言される場合、セカンダリ・サーバーは例外をスローします。

17.8.3 Oracle CQLの問合せの制約

高可用性アプリケーションでは、Oracle CQL問合せに次のような制約があります。Oracle CQLと、この項で取り上げているトピックの詳細は、『Oracle CQL言語リファレンス』の問合せに関する項を参照してください。

17.8.3.1 範囲ベースのウィンドウ

タイプ1アプリケーションでは、既存のセカンダリと完全に同一の出力イベントのシーケンスを生成する必要があり、すべての範囲ベースのOracle CQLウィンドウは、warm-up-window-lengthの時間よりも短くする必要があります。「適切なwarm-up-window-length時間の選択」を参照してください。

チャネルは、Oracle CQLの問合せが範囲ベースのウィンドウを含む場合にアプリケーション時間を使用する必要があります。アプリケーション時間の優先を参照してください。

17.8.3.2 タプルベースのウィンドウ

タイプ1アプリケーションでは、既存のセカンダリと完全に同一の出力イベントのシーケンスを生成する必要があり、すべてのタプルベースのウィンドウは、時間によって条件が付けられる必要があります。「適切なwarm-up-window-length時間の選択」を参照してください。

17.8.3.3 パーティション化されたウィンドウ

パーティションを再構築できない場合があるため、パーティション化されたウィンドウは避けてください。パーティション化されたウィンドウを使用する場合、Oracle Stream Analyticsサーバーの時間がパーティションを再構築するのに十分な長さとなるようにwarm-up-window-lengthを構成します。適切なwarm-up-window-length時間の選択を参照してください。

17.8.3.4 スライディング・ウィンドウ

マルチサーバー・ドメインに結合する新しいステージが、既存のステージと完全に同一の出力イベントを生成すると想定される場合、Oracle CQL問合せでスライディング・ウィンドウは使用しないでください。高可用性マルチサーバー・ドメインの再結合を参照してください。

17.8.3.5 DURATION句および非イベント検出

Oracle CQLの問合せが非イベント検出のDURATION句を含む場合、アプリケーション時間を使用する必要があります。「アプリケーション時間の優先」を参照してください。

17.8.3.6 アプリケーション時間の優先

Oracle Stream Analyticsでは、各イベントは、そのイベントの発生時点に関連付けられます。Oracle CQLは次の2種類を認識します。

- アプリケーション時間: イベントがOracle CQLプロセッサに入る前に、アプリケーションによってOracle CQLの外で各イベントに割り当てられた時間値です。

- システム時間: System.nanoTime()を必ずコールすることによって、Oracle CQLプロセッサに到着時にイベントに関連付けられる時間値です。

アプリケーション時間は、通常、アプリケーションの高可用性のために必要な最善の選択です。アプリケーション時間は、ダウンストリームにイベントが送信される前にイベントに関連付けられるため、アクティブなプライマリおよびセカンダリ・サーバーの全体に渡って整合性があります。

システム時間は、システム・クロックが同期されていないことによって、イベントに関連付けられた時間値が各サーバーで異なる可能性があるためアプリケーションのインスタンスに異なる結果を生成させます。Oracle CQLの問合せが時間ベースのウィンドウを使用しない場合、アプリケーションにシステム時間を使用できます。イベントベースのウィンドウのみ使用するアプリケーションは、受信時間ではなくイベントを受信した順番に依存するためこの場合はシステム時間を使用できます。

時間ベースのウィンドウを使用するOracle CQLの問合せに関してシステム時間を使用する必要がある場合は、Oracle Stream Analyticsの高可用性入力アダプタを使用する必要があります。このアダプタは、着信イベントを捕捉し、プライマリおよびセカンダリ・サーバーのインスタンス全体に渡る統一的な時間を割り当てます。

17.9 高可用性のサービス品質の構成

アセンブリおよびコンポーネント構成ファイルで、Oracle Stream Analyticsの高可用性のサービス品質を構成します。

Oracle Stream Analytics高可用性の構成を変更した後、Oracle Stream Analyticsアプリケーションを再デプロイする必要があります。

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

- シンプル・フェイルオーバーの構成

- バッファリングを使用するシンプル・フェイルオーバーの構成

- 軽量キュー・トリミングの構成

- JMSによる正確なリカバリの構成

17.9.1 シンプル・フェイルオーバーの構成

スライディング・ウィンドウのサイズをゼロ(0)に設定し、Oracle Stream Analytics高可用性バッファリング出力アダプタを使用してシンプル・フェイルオーバーを構成します。

この手順は、図17-9で示すEPNの例から始まり、シンプル・フェイルオーバー用に構成するために必要なコンポーネントを加えていきます。

図17-9 シンプル・フェイルオーバーのEPN

シンプル・フェイルオーバーの構成:

1. Oracle Coherenceを使用してマルチ・サーバー・ドメインを作成します。

詳細は、Oracle Stream Analyticsの管理のマルチサーバーの管理に関する項を参照してください。

2. Oracle Stream Analyticsアプリケーションを作成します。

3. MANIFEST.MFファイルを編集し、次のImport-Packageエントリを追加します。

- com.bea.wlevs.ede.api.cluster

- com.oracle.cep.cluster.hagroups

- com.oracle.cep.cluster.ha.adapter

- com.oracle.cep.cluster.ha.api

4. Oracle Stream AnalyticsアプリケーションEPNアセンブリ・ファイルを、次のアセンブリ・ファイル・エントリが示すように、Oracle Stream Analyticsの高可用性バッファリング出力アダプタを追加するように構成します。

- チャネルhelloworldOutputChannelの後に、providerをha-bufferingに設定したwlevs:adapter要素を追加します。

- idごとにha-bufferingアダプタを参照するように、チャネルhelloworldOutputChannelでwlevs:listener要素を更新します。

- wlevs:listener要素を、HelloWorldBeanクラスを参照するha-bufferingアダプタに追加します。

<wlevs:event-type-repository>
<wlevs:event-type type-name="HelloWorldEvent">            <wlevs:class>com.bea.wlevs.event.example.helloworld.HelloWorldEvent
</wlevs:class>
</wlevs:event-type>
</wlevs:event-type-repository>

<wlevs:adapter id="helloworldAdapter"
class="com.bea.wlevs.adapter.example.helloworld.HelloWorldAdapter" >
<wlevs:instance-property name="message" value="HelloWorld -
the current time is:"/>
</wlevs:adapter>

<wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
<wlevs:listener ref="helloworldProcessor"/>
</wlevs:channel>

<wlevs:processor id="helloworldProcessor" />

<wlevs:channel id="helloworldOutputChannel" event-type="HelloWorldEvent"
advertise="true">
<wlevs:listener ref="myHaSlidingWindowAdapter"/>
<wlevs:source ref="helloworldProcessor"/>
</wlevs:channel>

<wlevs:adapter id="myHaSlidingWindowAdapter" provider="ha-buffering" >
<wlevs:listener>
<bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
</wlevs:listener>
</wlevs:adapter>

5. オプションで、入力アダプタ(helloworldInputChannel)からのチャネル・ダウンストリームを構成し、アセンブリ・ファイル・エントリで示すように、適切なイベント・プロパティに基づいてアプリケーションのタイムスタンプを構成します。

シンプル・フェイルオーバーの場合、イベントはサーバー間で相関関係を持たないためシステムのタイムスタンプを使用できます。ただし、アプリケーションのタイムスタンプが使用されない場合、若干異なる結果がバッファから出力される可能性があります。

この例では、イベント・プロパティarrivalTimeが使用されます。

wlevs:expressionをこのイベント・プロパティに設定する必要があります。

<wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
<wlevs:listener ref="helloworldProcessor"/>
<wlevs:source ref="myHaInputAdapter"/>
<wlevs:application-timestamped>
<wlevs:expression>arrivalTime</wlevs:expression>
</wlevs:application-timestamped>
</wlevs:channel>

6. Oracle Stream Analyticsの高可用性バッファリング出力アダプタを構成します。

インスタンス・プロパティwindowLengthを、次に示すようにゼロ(0)に設定します。

<wlevs:adapter id="myHaSlidingWindowAdapter" provider="ha-buffering" >
<wlevs:listener>
<bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
</wlevs:listener>
<wlevs:instance-property name="windowLength" value="0"/>
</wlevs:adapter>

7. オプションで、コンポーネント構成ファイルを、次に示すように、Oracle Stream Analyticsの高可用性バッファリング出力アダプタを含むように構成します。

<processor>
<name>helloworldProcessor</name>
<rules>
<query id="helloworldRule">
<![CDATA[ select * from helloworldInputChannel [Now] >
</query>
</rules>
</processor>

<ha:ha-buffering-adapter >
<name>myHaSlidingWindowAdapter</name>
<window-length>0</window-length>
</ha:ha-buffering-adapter >

8. ステップ1で作成したデプロイメント・グループにアプリケーションをデプロイします。

Oracle Stream Analyticsにより、Oracle Stream Analyticsサーバーのいずれかが、プライマリとして自動的に選択されます。

17.9.2 バッファリングを使用するシンプル・フェイルオーバーの構成

スライディング・ウィンドウのサイズをゼロ(0)より大きく設定して、Oracle Stream Analyticsバッファリング出力アダプタを使用してシンプル・フェイルオーバーを構成します。

この手順は、図17-10で示すEPNの例から始まり、バッファリングを使用するシンプル・フェイルオーバー用に構成するために必要なコンポーネントを加えていきます。

図17-10 バッファリングEPNを使用するシンプル・フェイルオーバー

バッファリングを使用するシンプル・フェイルオーバーの構成:

1. Oracle Coherenceを使用してマルチ・サーバー・ドメインを作成します。

詳細は、Oracle Stream Analyticsの管理のマルチサーバーの管理に関する項を参照してください。

2. Oracle Stream Analyticsアプリケーションを作成します。

3. MANIFEST.MFファイルを編集し、次のImport-Packageエントリを追加します。

- com.bea.wlevs.ede.api.cluster

- com.oracle.cep.cluster.hagroups

- com.oracle.cep.cluster.ha.adapter

- com.oracle.cep.cluster.ha.api

4. Oracle Stream AnalyticsアプリケーションEPNアセンブリ・ファイルを、次のアセンブリ・ファイル・エントリが示すように、Oracle Stream Analyticsの高可用性バッファリング出力アダプタを追加するように構成します。

- チャネルhelloworldOutputChannelの後に、providerをha-bufferingに設定したwlevs:adapter要素を追加します。

- idごとにha-bufferingアダプタを参照するように、チャネルhelloworldOutputChannelでwlevs:listener要素を更新します。

- wlevs:listener要素を、HelloWorldBeanクラスを参照するha-bufferingアダプタに追加します。

<wlevs:event-type-repository>
<wlevs:event-type type-name="HelloWorldEvent">
<wlevs:class>com.bea.wlevs.event.example.helloworld.HelloWorldEvent</wlevs:class>
</wlevs:event-type>
</wlevs:event-type-repository>

<wlevs:adapter id="helloworldAdapter"
class="com.bea.wlevs.adapter.example.helloworld.HelloWorldAdapter" >
<wlevs:instance-property name="message" value="HelloWorld - the current time is:"/>
</wlevs:adapter>

<wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
<wlevs:listener ref="helloworldProcessor"/>
</wlevs:channel>

<wlevs:processor id="helloworldProcessor" />

<wlevs:channel id="helloworldOutputChannel" event-type="HelloWorldEvent" advertise="true">
<wlevs:listener ref="myHaSlidingWindowAdapter"/>
<wlevs:source ref="helloworldProcessor"/>
</wlevs:channel>

<wlevs:adapter id="myHaSlidingWindowAdapter" provider="ha-buffering" >
<wlevs:listener>
<bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
</wlevs:listener>
</wlevs:adapter>

5. オプションで、入力アダプタ(helloworldInputChannel)からのチャネル・ダウンストリームを構成し、次に示すように適切なイベント・プロパティに基づいてアプリケーションのタイムスタンプを構成します。

バッファリングを使用するシンプル・フェイルオーバーの場合、イベントはサーバー間で相関関係を持たないため、システムのタイムスタンプを使用できます。ただし、アプリケーションのタイムスタンプが使用されない場合、若干異なる結果がバッファから出力される可能性があります。

この例では、イベント・プロパティarrivalTimeが使用されます。

wlevs:expressionをこのイベント・プロパティに設定する必要があります。

<wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
<wlevs:listener ref="helloworldProcessor"/>
<wlevs:source ref="myHaInputAdapter"/>
<wlevs:application-timestamped>
<wlevs:expression>arrivalTime</wlevs:expression>
</wlevs:application-timestamped>
</wlevs:channel>

6. Oracle Stream Analyticsの高可用性バッファリング出力アダプタを構成します。

インスタンス・プロパティwindowLengthを、次に示すようにゼロ(0)より大きい値に設定します。

<wlevs:adapter id="myHaSlidingWindowAdapter" provider="ha-buffering" >
<wlevs:listener>
<bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
</wlevs:listener>
<wlevs:instance-property name="windowLength" value="15000"/>
</wlevs:adapter>

7. オプションで、コンポーネント構成ファイルを、次に示すように、Oracle Stream Analyticsの高可用性バッファリング出力アダプタを含むように構成します。

<processor>
<name>helloworldProcessor</name>
<rules>
<query id="helloworldRule">
<![CDATA[ select * from helloworldInputChannel [Now] >
</query>
</rules>
</processor>

<ha:ha-buffering-adapter >
<name>myHaSlidingWindowAdapter</name>
<window-length>15000</window-length>
</ha:ha-buffering-adapter >

8. アプリケーションが、Oracle Stream Analyticsの高可用性タイプ1アプリケーションで、既存のセカンダリと完全に同一の出力イベントのシーケンスを生成する必要がある場合、バッファリング出力アダプタのwarm-up-window-lengthを構成します。

詳細は、適切なwarm-up-window-length時間の選択を参照してください。

9. ステップ1で作成したデプロイメント・グループにアプリケーションをデプロイします。

Oracle Stream Analyticsにより、Oracle Stream Analyticsサーバーのいずれかが、プライマリとして自動的に選択されます。

17.9.3 軽量キュー・トリミングの構成

Oracle Stream Analyticsの高可用性入力アダプタおよびブロードキャスト出力アダプタを使用して、軽量キュー・トリミングを構成します。

この手順は、図17-11で示すEPNの例から始まり、軽量キュー・トリミング用に構成するために必要なコンポーネントを加えていきます。

図17-11 軽量キュー・トリミングのEPN

軽量キュー・トリミングの構成:

1. Oracle Coherenceを使用してマルチ・サーバー・ドメインを作成します。

詳細は、Oracle Stream Analyticsの管理のマルチサーバーの管理に関する項を参照してください。

2. Oracle Stream Analyticsアプリケーションを作成します。

3. MANIFEST.MFファイルを編集し、次のImport-Packageエントリを追加します。

- com.bea.wlevs.ede.api.cluster

- com.oracle.cep.cluster.hagroups

- com.oracle.cep.cluster.ha.adapter

- com.oracle.cep.cluster.ha.api

4. Oracle Stream AnalyticsアプリケーションEPNアセンブリ・ファイルを、次の例に示すように、Oracle Stream Analyticsの高可用性入力アダプタを追加するように構成します。

- 通常の入力アダプタhelloworldAdapterの後に、providerをha-inboundに設定したwlevs:adapter要素を追加します。

- wlevs:listener要素を、idごとにha-inboundアダプタを参照する通常の入力アダプタhelloworldAdapterに追加します。

- wlevs:source要素を、idごとにha-inboundアダプタを参照するhelloworldInputChannelに追加します。

<wlevs:event-type-repository>
<wlevs:event-type type-name="HelloWorldEvent">
<wlevs:class>com.bea.wlevs.event.example.helloworld.HelloWorldEvent</wlevs:class>
</wlevs:event-type>
</wlevs:event-type-repository>

<wlevs:adapter id="helloworldAdapter"
class="com.bea.wlevs.adapter.example.helloworld.HelloWorldAdapter" >
<wlevs:instance-property name="message" value="HelloWorld -
the current time is:"/>
<wlevs:listener ref="myHaInputAdapter"/>
</wlevs:adapter>

<wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
</wlevs:adapter>

<wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
<wlevs:listener ref="helloworldProcessor"/>
<wlevs:source ref="myHaInputAdapter"/>
</wlevs:channel>

<wlevs:processor id="helloworldProcessor" />

<wlevs:channel id="helloworldOutputChannel" event-type="HelloWorldEvent"
advertise="true">
<wlevs:listener>
<bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
</wlevs:listener>
<wlevs:source ref="helloworldProcessor"/>
</wlevs:channel>

5. Oracle Stream AnalyticsアプリケーションEPNアセンブリ・ファイルを、次に示すように、Oracle Stream Analyticsの高可用性ブロードキャスト出力アダプタを追加するように構成します。

- チャネルhelloworldOutputChannelの後に、providerをha-broadcastに設定したwlevs:adapter要素を追加します。

- idごとにha-broadcastアダプタを参照するように、チャネルhelloworldOutputChannelでwlevs:listener要素を更新します。

- wlevs:listener要素を、HelloWorldBeanクラスを参照するha-broadcastアダプタに追加します。

<wlevs:event-type-repository>
<wlevs:event-type type-name="HelloWorldEvent">
<wlevs:class>com.bea.wlevs.event.example.helloworld.HelloWorldEvent
</wlevs:class>
</wlevs:event-type>
</wlevs:event-type-repository>

<wlevs:adapter id="helloworldAdapter"
class="com.bea.wlevs.adapter.example.helloworld.HelloWorldAdapter" >
<wlevs:instance-property name="message" value="HelloWorld -
the current time is:"/>
<wlevs:listener ref="myHaInputAdapter"/>
</wlevs:adapter>

<wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
</wlevs:adapter>

<wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
<wlevs:listener ref="helloworldProcessor"/>
<wlevs:source ref="myHaInputAdapter"/>
</wlevs:channel>

<wlevs:processor id="helloworldProcessor" />

<wlevs:channel id="helloworldOutputChannel" event-type="HelloWorldEvent"
advertise="true">
<wlevs:listener ref="myHaBroadcastAdapter"/>
<wlevs:source ref="helloworldProcessor"/>
</wlevs:channel>

<wlevs:adapter id="myHaBroadcastAdapter" provider="ha-broadcast" >
<wlevs:listener>
<bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
</wlevs:listener>
</wlevs:adapter>

6. Oracle Stream Analyticsの高可用性入力アダプタを構成します。

次の構成例のいずれかを使用することを検討します。

この例は、すべてのデフォルトを使用した高可用性入力アダプタの構成を示します。必須キーはすべてのイベント・プロパティに基づいており、高可用性入力アダプタが時間値を割り当てる対象のイベント・プロパティは、arrivalTimeという名前のイベント・プロパティです。

<wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
<wlevs:instance-property name="timeProperty" value="arrivalTime"/>
</wlevs:adapter>

この例は、すべてのデフォルトを使用した高可用性入力アダプタの構成を示します。必須キーはすべてのイベント・プロパティに基づいており、高可用性入力アダプタが時間値を割り当てる対象のイベント・プロパティは、arrivalTimeという名前のイベント・プロパティです。イベントはタプル・ベースのイベントであるため、eventTypeプロパティを使用してイベント型(MyEventType)を指定する必要があります。

<wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
<wlevs:instance-property name="timeProperty" value="arrivalTime"/>
<wlevs:instance-property name="eventType" value="MyEventType"/>
</wlevs:adapter>

この例は、高可用性入力アダプタの構成を示します。ここでは、必須キーはイベント・プロパティ(idという名前)に基づいており、高可用性入力アダプタが時間値を割り当てる対象のイベント・プロパティは、arrivalTimeという名前のイベント・プロパティです。

<wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
<wlevs:instance-property name="keyProperties" value="id"/>
<wlevs:instance-property name="timeProperty" value="arrivalTime"/>
</wlevs:adapter>

この例は、高可用性入力アダプタの構成を示します。ここでは、必須キーは1つ以上のイベント・プロパティ(orderIDおよびaccountIDプロパティ)に基づいており、高可用性入力アダプタが時間値を割り当てる対象のイベント・プロパティは、arrivalTimeという名前のイベント・プロパティです。

<wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
<wlevs:instance-property name="timeProperty" value="arrivalTime"/>
<wlevs:instance-property name="keyClass" value="com.acme.MyCompoundKeyClass"/>
</wlevs:adapter>

複合キーのJavaクラス(com.acme.MyCompoundKeyClass)は必須で、その実装を例に示します。hashCodeおよびequalsメソッドが必要になります。keyClassを指定するとき、keyPropertiesインスタンス・プロパティは無視されます。Oracle Stream Analyticsは、複合キーがkeyClass内のすべてのゲッター・メソッドに基づくと仮定します。

package com.acme;

public class MyCompoundKeyClass {
private int orderID;
private int accountID;

public MyCompoundKeyClass() {}

public int getOrderID() {
return orderID;
}
public setOrderID(int orderID) {
this.orderID = orderID;
}
public int getAccountID() {
return accountID;
}
public setOrderID(int accountID) {
this.accountID = accountID;
}

public int hashCode() {
int hash = 1;
hash = hash * 31 + orderID.hashCode();
hash = hash * 31 + (accountID == null ? 0 : accountID.hashCode());
return hash;
}

public boolean equals(Object obj) {
if (obj == this) return true;
if (obj == null) return false;
if (!(obj instanceof MyCompoundKeyClass)) return false;
MyCompoundKeyClass k = (MyCompoundKeyClass) obj;
return k.accountID == accountID && k.orderID == orderID;
}
}

7. 高可用性入力アダプタ(helloworldInputChannel)からのチャネル・ダウンストリームを構成し、次の例で示される高可用性入力アダプタのtimeProperty設定に基づいて、アプリケーションのタイムスタンプを構成します。

wlevs:expressionをtimePropertyの値に設定する必要があります。

<wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
<wlevs:instance-property name="keyProperties" value="id"/>
<wlevs:instance-property name="eventType" value="HelloWorldEvent"/>
<wlevs:instance-property name="timeProperty" value="arrivalTime"/>
</wlevs:adapter>

<wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
<wlevs:listener ref="helloworldProcessor"/>
<wlevs:source ref="myHaInputAdapter"/>
<wlevs:application-timestamped>
<wlevs:expression>arrivalTime</wlevs:expression>
</wlevs:application-timestamped>
</wlevs:channel>

8. Oracle Stream Analyticsの高可用性ブロードキャスト出力アダプタを構成します。

次の構成例のいずれかを使用することを検討します。

この例は、すべてのデフォルトを使用したブロードキャスト出力アダプタの構成を示します。必須キーはすべてのイベント・プロパティに基づいており、キーの値は非モノトニック(継続的に増加しません)かつ全体順序(一意)です。

<wlevs:adapter id="myHaSlidingWindowAdapter" provider="ha-broadcast" >
<wlevs:listener>
<bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
</wlevs:listener>
</wlevs:adapter>

この例は、ブロードキャスト出力アダプタの構成を示します。ここでは、必須キーはイベント・プロパティ(timePropertyという名前)に基づいており、キーの値はモノトニック(継続的に増加します)かつ全体順序ではありません(一意ではありません)。

<wlevs:adapter id="myHaSlidingWindowAdapter" provider="ha-broadcast" >
<wlevs:listener>
<bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
</wlevs:listener>
<wlevs:instance-property name="keyProperties" value="timeProperty"/>
<wlevs:instance-property name="monotonic" value="true"/>
<wlevs:instance-property name="totalOrder" value="false"/>
</wlevs:adapter>

この例は、ブロードキャスト出力アダプタの構成を示します。ここでは、必須キーは1つ以上のイベント・プロパティ(timePropertyおよびaccountIDプロパティ)に基づいており、キーの値はモノトニック(継続的に増加します)かつ全体順序(一意)です。

<wlevs:adapter id="myHaSlidingWindowAdapter" provider="ha-broadcast" >
<wlevs:listener>
<bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
</wlevs:listener>
<wlevs:instance-property name="keyClass" value="com.acme.MyCompoundKeyClass"/>
<wlevs:instance-property name="monotonic" value="true"/>
<wlevs:instance-property name="totalOrder" value="true"/>
</wlevs:adapter>

複合キーのJavaクラス(com.acme.MyCompoundKeyClass)は必須で、その実装は次の例で示されます。hashCodeおよびequalsメソッドが必要になります。keyClassを指定するとき、keyPropertiesインスタンス・プロパティは無視されます。Oracle Stream Analyticsは、複合キーがkeyClass内のすべてのゲッター・メソッドに基づくと仮定します。

package com.acme;

public class MyCompoundKeyClass {
private int timeProperty;
private int accountID;

public MyCompoundKeyClass() {}

public int getTimeProperty() {
return orderID;
}
public setTimeProperty(int timeProperty) {
this.timeProperty = timeProperty;
}
public int getAccountID() {
return accountID;
}
public setOrderID(int accountID) {
this.accountID = accountID;
}

public int hashCode() {
int hash = 1;
hash = hash * 31 + timeProperty.hashCode();
hash = hash * 31 + (accountID == null ? 0 : accountID.hashCode());
return hash;
}

public boolean equals(Object obj) {
if (obj == this) return true;
if (obj == null) return false;
if (!(obj instanceof MyCompoundKeyClass)) return false;
MyCompoundKeyClass k = (MyCompoundKeyClass) obj;
return k.accountID == accountID && k.orderID == orderID;
}
}

9. オプションで、コンポーネント構成ファイルを、次に示すように、Oracle Stream Analyticsの高可用性入力アダプタおよびバッファリング出力アダプタを含むように構成します。

<processor>
<name>helloworldProcessor</name>
<rules>
<query id="helloworldRule">
<![CDATA[ select * from helloworldInputChannel [Now] >
</query>
</rules>
</processor>

<ha:ha-inbound-adapter>
<name>myHaInputAdapter</name>
</ha:ha-inbound-adapter>

<ha:ha-broadcast-adapter>
<name>myHaBroadcastAdapter</name>
<trimming-interval units="events">10</trimming-interval>
</ha:ha-broadcast-adapter>

10. アプリケーションが、Oracle Stream Analyticsの高可用性タイプ1アプリケーションで、既存のセカンダリと完全に同一の出力イベントのシーケンスを生成する必要がある場合、ブロードキャスト出力アダプタのwarm-up-window-lengthを構成します。

11. Oracle Stream Analyticsにより、Oracle Stream Analyticsサーバーのいずれかが、プライマリとして自動的に選択されます。

17.9.4 JMSによる正確なリカバリの構成

Oracle Stream Analyticsの高可用性入力アダプタおよび相関出力アダプタを使用して、JMSによる正確なリカバリを構成します。

この手順では、図17-12が示すEPNの例を作成する方法を説明します。このOracle Stream Analytics高可用性のサービス品質の詳細は、JMSによる正確なリカバリを参照してください。

注:

正確なリカバリのためにJMSアダプタによって使用されるJMS宛先は、キューではなくトピックである必要があります。

図17-12 JMSのEPNによる正確なリカバリ

JMSによる正確なリカバリの構成

1. Oracle Coherenceを使用してマルチ・サーバー・ドメインを作成します。

詳細は、Oracle Stream Analyticsの管理のマルチサーバーの管理に関する項を参照してください。

2. Oracle Stream Analyticsアプリケーションを作成します。

3. MANIFEST.MFファイルを編集し、次のImport-Packageエントリを追加します。

- com.bea.wlevs.ede.api.cluster

- com.oracle.cep.cluster.hagroups

- com.oracle.cep.cluster.ha.adapter

- com.oracle.cep.cluster.ha.api

4. Oracle Stream AnalyticsアプリケーションEPNアセンブリ・ファイルを、次に示すように、Oracle Stream Analyticsの高可用性入力アダプタを追加するように構成します。

- 通常の入力アダプタJMSInboundAdapterの後に、providerをha-inboundに設定したwlevs:adapter要素を追加します。

- wlevs:listener要素を、idごとにha-inboundアダプタを参照する通常の入力アダプタJMSInboundAdapterに追加します。

- wlevs:source要素を、idごとにha-inboundアダプタを参照するチャネルchannel1に追加します。

<wlevs:event-type-repository>
<wlevs:event-type type-name="StockTick">
<wlevs:properties>
<wlevs:property name="lastPrice" type="double" />
<wlevs:property name="symbol" type="char" />
</wlevs:properties>
</wlevs:event-type>
</wlevs:event-type-repository>

<wlevs:adapter id="JMSInboundAdapter" provider="jms-inbound">
<wlevs:listener ref="myHaInputAdapter"/>
</wlevs:adapter>

<wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
</wlevs:adapter>

<wlevs:channel id="channel1" event-type="StockTick">
<wlevs:listener ref="processor1" />
<wlevs:source ref="myHaInputAdapter"/>
</wlevs:channel>

5. Oracle Stream AnalyticsアプリケーションEPNアセンブリ・ファイルを、次に示すように、Oracle Stream Analyticsの高可用性相関出力アダプタを追加するように構成します。

- チャネルchannel2の後に、providerをha-correlatingに設定したwlevs:adapter要素を追加します。

- idごとにha-correlatingアダプタを参照するように、チャネルchannel2でwlevs:listener要素を更新します。

- wlevs:listener要素を、JMSOutboundAdapterクラスを参照するha-correlatingアダプタに追加します。

<wlevs:event-type-repository>
<wlevs:event-type type-name="StockTick">
<wlevs:properties>
<wlevs:property name="lastPrice" type="double" />
<wlevs:property name="symbol" type="char" />
</wlevs:properties>
</wlevs:event-type>
</wlevs:event-type-repository>

<wlevs:adapter id="JMSInboundAdapter" provider="jms-inbound">
<wlevs:listener ref="myHaInputAdapter"/>
</wlevs:adapter>

<wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
</wlevs:adapter>

<wlevs:channel id="channel1" event-type="StockTick">
<wlevs:listener ref="processor1" />
<wlevs:source ref="myHaInputAdapter"/>
</wlevs:channel>

<wlevs:processor id="processor1">
<wlevs:listener ref="channel2" />
</wlevs:processor>

<wlevs:channel id="channel2" event-type="StockTick">
<wlevs:listener ref="myHaCorrelatingAdapter" />
</wlevs:channel>

<wlevs:adapter id="myHaCorrelatingAdapter" provider="ha-correlating" >
<wlevs:listener ref="JMSOutboundAdapter"/>
</wlevs:adapter>

<wlevs:adapter id="JMSOutboundAdapter" provider="jms-outbound">
</wlevs:adapter>

6. Oracle Stream Analyticsの高可用性入力アダプタを構成します。

次の構成例のいずれかを使用することを検討します。

この例は、すべてのデフォルトを使用した高可用性入力アダプタの構成を示します。必須キーはすべてのイベント・プロパティに基づいており、高可用性入力アダプタが時間値を割り当てる対象のイベント・プロパティは、arrivalTimeという名前のイベント・プロパティです。

<wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
<wlevs:instance-property name="timeProperty" value="arrivalTime"/>
</wlevs:adapter>

この例は、すべてのデフォルトを使用した高可用性入力アダプタの構成を示します。必須キーはすべてのイベント・プロパティに基づいており、高可用性入力アダプタが時間値を割り当てる対象のイベント・プロパティは、arrivalTimeという名前のイベント・プロパティです。イベントはタプル・ベースのイベントであるため、eventTypeプロパティを使用してイベント型(MyEventType)を指定する必要があります。

<wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
<wlevs:instance-property name="timeProperty" value="arrivalTime"/>
<wlevs:instance-property name="eventType" value="MyEventType"/>
</wlevs:adapter>

この例は、高可用性入力アダプタの構成を示します。ここでは、必須キーはイベント・プロパティ(sequenceNoという名前)に基づいており、高可用性入力アダプタが時間値を割り当てる対象のイベント・プロパティは、inboundTimeという名前のイベント・プロパティです。

<wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
<wlevs:instance-property name="keyProperties" value="sequenceNo"/>
<wlevs:instance-property name="timeProperty" value="inboundTime"/>
</wlevs:adapter>

この例は、高可用性入力アダプタの構成を示します。ここでは、必須キーは1つ以上のイベント・プロパティ(orderIDおよびaccountIDプロパティ)に基づいており、高可用性入力アダプタが時間値を割り当てる対象のイベント・プロパティは、arrivalTimeという名前のイベント・プロパティです。

複合キーのJavaクラス(com.acme.MyCompoundKeyClass)は必須で、その実装を例に示します。hashCodeおよびequalsメソッドが必要になります。keyClassを指定するとき、keyPropertiesインスタンス・プロパティは無視されます。Oracle Stream Analyticsは、複合キーがkeyClass内のすべてのゲッター・メソッドに基づくと仮定します。

<wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
<wlevs:instance-property name="timeProperty" value="arrivalTime"/>
<wlevs:instance-property name="keyClass" value="com.acme.MyCompoundKeyClass"/>
</wlevs:adapter>

package com.acme;

public class MyCompoundKeyClass {
private int orderID;
private int accountID;

public MyCompoundKeyClass() {}

public int getOrderID() {
return orderID;
}
public setOrderID(int orderID) {
this.orderID = orderID;
}
public int getAccountID() {
return accountID;
}
public setOrderID(int accountID) {
this.accountID = accountID;
}

public int hashCode() {
int hash = 1;
hash = hash * 31 + orderID.hashCode();
hash = hash * 31 + (accountID == null ? 0 : accountID.hashCode());
return hash;
}

public boolean equals(Object obj) {
if (obj == this) return true;
if (obj == null) return false;
if (!(obj instanceof MyCompoundKeyClass)) return false;
MyCompoundKeyClass k = (MyCompoundKeyClass) obj;
return k.accountID == accountID && k.orderID == orderID;
}
}

7. 入力アダプタ(channel1)からのチャネル・ダウンストリームを構成し、次の例で示される高可用性入力アダプタのtimeProperty設定に基づいて、アプリケーションのタイムスタンプを構成します。

wlevs:expressionをtimePropertyの値に設定する必要があります。

<wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
<wlevs:instance-property name="eventType" value="HelloWorldEvent"/>
<wlevs:instance-property name="keyProperties" value="sequenceNo"/>
<wlevs:instance-property name="timeProperty" value="inboundTime"/>
</wlevs:adapter>

<wlevs:channel id="channel1" event-type="StockTick">
<wlevs:listener ref="processor1" />
<wlevs:source ref="myHaInputAdapter"/>
<wlevs:application-timestamped>
<wlevs:expression>inboundTime</wlevs:expression>
</wlevs:application-timestamped>
</wlevs:channel>

8. Oracle Stream Analyticsの高可用性相関出力アダプタfailOverDelayを構成します。

次の例は、相関出力アダプタの構成を示し、ここではfailOverDelayが2000ミリ秒になっています。

<wlevs:adapter id="myHaCorrelatingAdapter" provider="ha-correlating" >
<wlevs:listener ref="JMSOutboundAdapter"/>
<wlevs:instance-property name="failOverDelay" value="2000"/>
</wlevs:adapter>

9. 2番目の通常JMS入力アダプタを作成します。

次の例は、JMSInboundAdapter2という名前のJMSアダプタを示しています。

<wlevs:adapter id="JMSInboundAdapter2" provider="jms-inbound">
</wlevs:adapter>

次のJMS入力アダプタは、1番目のJMS入力アダプタ(JMSInboundAdapterなど)と同一となるように構成する必要があります。次の例は、両方のJMS入力アダプタのコンポーネント構成ファイルを示します。両アダプタは、同一のプロバイダを含む完全に同一の構成になる必要があります。

<jms-adapter>
<name>JMSInboundAdapter</name>
<jndi-provider-url>t3://localhost:7001</jndi-provider-url>
<destination-jndi-name>./Topic1</destination-jndi-name>
<user>weblogic</user>
<password>weblogic</password>
<work-manager>JettyWorkManager</work-manager>
<concurrent-consumers>1</concurrent-consumers>
</jms-adapter>

<jms-adapter>
<name>JMSInboundAdapter2</name>
<jndi-provider-url>t3://localhost:7001</jndi-provider-url>
<destination-jndi-name>./Topic2</destination-jndi-name>
<user>weblogic</user>
<password>weblogic</password>
<work-manager>JettyWorkManager</work-manager>
<concurrent-consumers>1</concurrent-consumers>
</jms-adapter>
...
</wlevs:config>

10. 相関ソースとして機能するチャネルを作成します。

ソースとして2番目の通常JMS入力アダプタを持つこのチャネルを構成する必要があります。

次の例は、ソースがJMSInboundAdapter2のclusterCorrelatingOutstreamという名前の相関ソースを示します。

<wlevs:adapter id="JMSInboundAdapter2" provider="jms-inbound">
</wlevs:adapter>

<wlevs:channel id="clusterCorrelatingOutstream" event-type="StockTick" advertise="true">
<wlevs:source ref="JMSInboundAdapter2"/>
</wlevs:channel>

11. correlatedSourceを持つOracle Stream Analyticsの高可用性相関出力アダプタを構成します。

次の例は、相関出力アダプタの構成を示し、ここではcorrelatedSourceがclusterCorrelatingOutstreamになっています。

<wlevs:adapter id="myHaCorrelatingAdapter" provider="ha-correlating" >
<wlevs:listener ref="JMSOutboundAdapter"/>
<wlevs:instance-property name="failOverDelay" value="2000"/>
<wlevs:instance-property name="correlatedSource"       ref="clusterCorrelatingOutstream"/>
</wlevs:adapter>

12. アプリケーションが、Oracle Stream Analyticsの高可用性タイプ1アプリケーションで、既存のセカンダリと完全に同一の出力イベントのシーケンスを生成する必要がある場合、相関出力アダプタのwarm-up-window-lengthを構成します。

13. コンポーネント構成ファイルを構成し、次の例で示すように、インバウンドJMSアダプタおよびアウトバウンドJMSアダプタのsession-transactedを有効にします。

<jms-adapter>
<name>JMSInboundAdapter</name>
<jndi-provider-url>t3://localhost:7001</jndi-provider-url>
<destination-jndi-name>./Topic1</destination-jndi-name>
<user>weblogic</user>
<password>weblogic</password>
<work-manager>JettyWorkManager</work-manager>
<concurrent-consumers>1</concurrent-consumers>
<session-transacted>true</session-transacted>
</jms-adapter>

<jms-adapter>
<name>JMSInboundAdapter2</name>
<jndi-provider-url>t3://localhost:7001</jndi-provider-url>
<destination-jndi-name>./Topic2</destination-jndi-name>
<user>weblogic</user>
<password>weblogic</password>
<work-manager>JettyWorkManager</work-manager>
<concurrent-consumers>1</concurrent-consumers>
<session-transacted>true</session-transacted>
</jms-adapter>
...
<jms-adapter>
<name>JMSOutboundAdapter</name>
<event-type>JMSEvent</event-type>
<jndi-provider-url>t3://localhost:7001</jndi-provider-url>
<destination-jndi-name>./Topic2</destination-jndi-name>
<delivery-mode>nonpersistent</delivery-mode>
<session-transacted>true</session-transacted>
</jms-adapter>
...
</wlevs:config>

14. オプションで、コンポーネント構成ファイルを、次に示すように、Oracle Stream Analyticsの高可用性入力アダプタおよび相関出力アダプタを含むように構成します。

<ha:ha-inbound-adapter>
<name>myHaInputAdapter</name>
</ha:ha-inbound-adapter>
...
<ha:ha-correlating-adapter>
<name>myHaBroadcastAdapter</name>
<fail-over-delay>2000</fail-over-delay>
</ha:ha-correlating-adapter>

15. オプションで、ActiveActiveGroupBeanをEPNに追加し、スケーラビリティを向上します。

詳細は、着信JMSイベント・ストリームのパーティション化を参照してください。

16. Oracle Stream Analyticsにより、Oracle Stream Analyticsサーバーのいずれかが、プライマリとして自動的に選択されます。

17.10 高可用性アダプタの構成

チャネルやプロセッサなどのEPN内の他のコンポーネントを構成する方法と同様に、EPNアセンブリ・ファイルおよびコンポーネント構成ファイルでOracle Stream Analyticsの高可用性アダプタを構成します。

Oracle Stream Analytics高可用性の構成を変更した後、Oracle Stream Analyticsアプリケーションを再デプロイする必要があります。OSGiバンドルのデプロイを参照してください。

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

- 高可用性入力アダプタの構成

- バッファリング出力アダプタの構成

- ブロードキャスト出力アダプタの構成

- 相関出力アダプタの構成

17.10.1 高可用性入力アダプタの構成

Oracle Stream Analyticsの高可用性ブロードキャスト入力アダプタは、BroadcastInputAdapterインタフェースによって実装されます。

アセンブリ・ファイル

Oracle Stream Analyticsの高可用性入力アダプタを宣言するためのルート要素は、provider要素をha-inboundに設定したwlevs:adapterです。入力アダプタでOracle Stream Analyticsの高可用性入力アダプタのwlevs:listener要素も指定します。

<wlevs:adapter id="jmsAdapter" provider="jms-inbound"
<wlevs:listener ref="myHaInputAdapter"/>
</wlevs:adapter>

<wlevs:adapter id="myHaInputAdapter" provider="ha-inbound">
<wlevs:instance-property name="keyProperties" value="id"/>
<wlevs:instance-property name="timeProperty" value="arrivalTime"/>
<wlevs:instance-property name="eventType" value="MyEventType"/>
</wlevs:adapter>

<wlevs:channel id="inputChannel" event-type="MyEventType ">
<wlevs:source ref="myHaInputAdapter"/>
<wlevs:application-timestamped>
<wlevs:expression>arrivalTime</wlevs:expression>
</wlevs:application-timestamped>
</wlevs:channel>

表17-3は、追加子要素を説明しています。

表17-3 高可用性入力アダプタ用wlevs:adapterの子要素

子要素

説明

wlevs:instance-property

1つ以上のinstance-property要素のnameおよびvalue属性を指定します。

表17-4に、サポートされているインスタンス・プロパティと、その名前属性および値属性を示します。

表17-4 高可用性入力アダプタのインスタンス・プロパティ

名前

値

timeProperty

高可用性入力アダプタが時間値を割り当てる対象のイベント・プロパティ名を指定します。

これは、高可用性入力アダプタの接続対象となる、ダウンストリームEPNコンポーネントのwlevs:application-timestamped要素で使用するプロパティと同一です。

keyProperties

Oracle Stream Analyticsの高可用性入力アダプタがイベント・インスタンスを識別するために使用する、1つ以上のイベント・プロパティのスペースで区切られたリストを指定します。

1つ以上のプロパティを指定する場合は、keyClassを指定する必要があります。

デフォルト: すべてのイベント・プロパティ。

keyClass

複合キーとして使用される完全修飾Javaクラス名を指定します。

デフォルトでは、keyProperties設定が使用されない場合、keyClass内のすべてのJavaBeanプロパティがkeyPropertiesとなるように仮定されます。

eventType

Oracle Stream Analyticsの高可用性入力アダプタが実際の入力アダプタから受信するイベントの種類名を指定します。これは、高可用性入力アダプタの接続対象となる、ダウンストリームEPNコンポーネントで使用するイベント型と同一です。

タプル・イベントの場合、このプロパティは必須です。すべての他のJavaクラス・ベースのイベント型の場合、このプロパティはオプションです。

構成ファイル

Oracle Stream Analyticsの高可用性入力アダプタの構成用ルート要素は、ha-inbound-adapterです。name子要素は、次に示すアセンブリ・ファイル内の対応するwlevs:adapter要素のid属性と一致している必要があります。

<ha:ha-inbound-adapter>
<name>myHaInputAdapter</name>
<heartbeat units="millis">1000</heartbeat>
<batch-size>10</batch-size>
</ha:ha-inbound-adapter>

表17-5は、追加子要素を説明しています。

表17-5 子要素

子要素

説明

heartbeat

時間を進めるためのハートビート・イベントを生成するまでに高可用性入力アダプタが待機できる時間の長さを指定します。

units属性の有効な整数値:

- nanos: 指定されたナノ秒数を待機します。

- millis: 指定されたミリ秒数を待機します。

- secs: 指定された秒数を待機します。

デフォルト: ハートビートが送信されません。

batch-size

プライマリがセカンダリにブロードキャストする各タイミング・メッセージにおいてイベント数を指定します。nの値は、nと{key, time}のペアが各メッセージに送信されるという意味になります。このプロパティは、パフォーマンス・チューニングに使用できます。

デフォルト: 1 (バッチを無効化)。

17.10.2 バッファリング出力アダプタの構成

Oracle Stream Analyticsの高可用性バッファリング出力アダプタは、SlidingWindowQueueTrimmingAdapterインタフェースによって実装されます。

アセンブリ・ファイル

Oracle Stream Analyticsの高可用性バッファリング出力アダプタを宣言するためのルート要素は、次の例で示すように、provider要素をha-bufferingに設定したwlevs:adapterです。

<wlevs:adapter id="mySlidingWindowingAdapter" provider ="ha-buffering">
<wlevs:listener>
<bean class="com.bea.wlevs.example.cluster.ClusterAdapterBean"/>
</wlevs:listener>
<wlevs:instance-property name="windowLength" value="15000"/>
</wlevs:adapter>

表17-6は、追加子要素を説明しています。

表17-6 子要素

子要素

説明

wlevs:listener

このOracle Stream Analyticsの高可用性バッファリング出力アダプタから、通常の出力アダプタのダウンストリームを指定します。

wlevs:instance-property

表17-7で説明するように、instance-property要素のnameおよびvalue属性を1つ以上指定します。

表17-7は、インスタンス・プロパティを一覧表示しています。

表17-7 インスタンス・プロパティ

名前

値

windowLength

スライディング・ウィンドウのサイズを整数のミリ秒で指定します。

デフォルト: 15000。

構成ファイル

Oracle Stream Analyticsの高可用性バッファリング出力アダプタの構成用ルート要素は、ha-buffering-adapterです。特定のアダプタのname子要素は、次に示すアセンブリ・ファイル内の対応するwlevs:adapter要素のid属性と一致している必要があります。

<ha:ha-buffering-adapter >
<name>mySlidingWindowingAdapter</name>
<window-length>15000</window-length>
<warm-up-window-length units="minutes">6</warm-up-window-length>
</ha:ha-buffering-adapter >

表17-8は、Oracle Stream Analyticsの高可用性バッファリング出力アダプタに構成できるha-buffering-adapterの追加子要素を示します。

表17-8 子要素

子要素

説明

window-length

スライディング・ウィンドウのサイズを整数のミリ秒で指定します。

デフォルト: 15000

warm-up-window-length

時間を進めるためのハートビート・イベントを生成するまでに高可用性入力アダプタが待機できる時間の長さを指定します。

units属性の有効な整数値:

- seconds: 指定された秒数を待機します。

- minutes: 指定された分数を待機します。

デフォルト: unitsはsecondsです。

17.10.3 ブロードキャスト出力アダプタの構成

Oracle Stream Analyticsの高可用性ブロードキャスト出力アダプタは、GroupBroadcastQueueTrimmingAdapterクラスによって実装されます。

アセンブリ・ファイル

Oracle Stream Analyticsの高可用性ブロードキャスト出力アダプタを宣言するためのルート要素は、次に示すように、provider要素をha-broadcastに設定したwlevs:adapterです。

<wlevs:adapter id="myBroadcastAdapter" provider="ha-broadcast">
<wlevs:listener ref="actualAdapter"/>
<wlevs:instance-property name="keyProperties" value="time"/>
<wlevs:instance-property name="monotonic" value="true"/>
</wlevs:adapter>

表17-9は、追加子要素を説明しています。

表17-9 子要素

子要素

説明

wlevs:listener

このOracle Stream Analyticsの高可用性ブロードキャスト出力アダプタから、通常の出力アダプタのダウンストリームを指定します。

wlevs:instance-property

表17-10で説明するように、instance-property要素のnameおよびvalue属性を1つ以上指定します。

表17-10は、インスタンス・プロパティを一覧表示しています。

表17-10 インスタンス・プロパティ

名前

値

keyProperties

Oracle Stream Analyticsの高可用性ブロードキャスト出力アダプタがイベント・インスタンスを識別するために使用する、1つ以上のイベント・プロパティのスペースで区切られたリストを指定します。

1つ以上のプロパティを指定する場合は、keyClassを指定する必要があります。

デフォルト: すべてのイベント・プロパティ。

keyClass

複合キーとして使用されるJavaクラスの完全修飾なクラス名を指定します。

デフォルトでは、keyProperties設定が使用されない場合、keyClass内のすべてのJavaBeanプロパティがkeyPropertiesとなるように仮定されます。

複合キーは、monotonicおよびtotalOrderになることがあります。

monotonic

キーの値が(時間値のように)常に増加するかどうかを指定します。

有効値は次のとおりです。

- true: キーは常に増加します。

- false: キーは常に増加しません。

デフォルト: false。

totalOrder

イベント・キーが一意かどうかを指定します。インスタンス・プロパティmonotonicがtrueに設定されている場合のみ適用できます。

有効な値は次のとおりです。

- true: イベント・キーは一意です。

- false: イベント・キーは一意ではありません。

デフォルト: true。

構成ファイル

Oracle Stream Analyticsの高可用性ブロードキャスト出力アダプタの構成用ルート要素は、ha-broadcast-adapterです。特定のアダプタのname子要素は、次に示すように、このアダプタが宣言されているEPNアセンブリ・ファイル内の対応するwlevs:adapter要素のid属性と一致している必要があります。

<ha:ha-broadcast-adapter>
<name>myBroadcastAdapter</name>
<trimming-interval units="events">10</trimming-interval>
<warm-up-window-length units="minutes">6</warm-up-window-length>
</ha:ha-broadcast-adapter>

表17-11は、追加子要素を説明しています。

表17-11 子要素

子要素

説明

trimming-interval

トリミング・メッセージがunitsの整数の数としてブロードキャストされる間隔を指定します。このプロパティをパフォーマンスの調整に使用できます(高可用性パフォーマンスのチューニングを参照)。

units属性の有効な値:

- events: 指定されたイベント数の処理後に、トリミング・メッセージをブロードキャストします。

- millis: 指定されたミリ秒数の後に、トリミング・メッセージをブロードキャストします。

デフォルト: unitsはeventsです。

warm-up-window-length

以前に失敗したセカンダリの再起動後または新しいセカンダリが追加された後、アプリケーションが状態を再構築するのにかかる時間の長さを指定します。

units属性の有効な整数値:

- seconds: 指定された秒数を待機します。

- minutes: 指定された分数を待機します。

デフォルト: unitsはsecondsです。

詳細は、「適切なwarm-up-window-length時間の選択」を参照してください。

17.10.4 相関出力アダプタの構成

Oracle Stream Analyticsの高可用性相関出力アダプタは、CorrelatedQueueTrimmingAdapterインタフェースによって実装されます。

アセンブリ・ファイル

Oracle Stream Analyticsの高可用性相関出力アダプタを宣言するためのルート要素は、次に示すように、provider要素をha-correlatingに設定したwlevs:adapterです。

<wlevs:adapter id="myCorrelatingAdapter" provider="ha-correlating">
<wlevs:listener>
<bean class="com.bea.wlevs.example.cluster.ClusterAdapterBean"/>
</wlevs:listener>
<wlevs:instance-property name="correlatedSource" ref="clusterCorrOutstream"/>
<wlevs:instance-property name="failOverDelay" value="2000"/>
</wlevs:adapter>

表17-12は、追加子要素を説明しています。

表17-12 子要素

子要素

説明

wlevs:listener

このOracle Stream Analyticsの高可用性バッファリング出力アダプタから、通常の出力アダプタのダウンストリームを指定します。

wlevs:instance-property

表17-13で説明するように、instance-property要素のnameおよびvalue属性を1つ以上指定します。

表17-13は、インスタンス・プロパティを一覧表示しています。

表17-13 インスタンス・プロパティ

名前

値

correlatedSource

相関対象のイベント・ソースを指定します。このソースから参照されるイベントは、トリミング・キューからパージされます。フェイルオーバー時にキュー内に留まるイベントは再生されます。

failOverDelay

フェイルオーバー後に相関関係が再起動される速さを決定するために使用される、遅延タイムアウトをミリ秒単位で指定します。

デフォルト: 0ミリ秒。

構成ファイル

Oracle Stream Analyticsの高可用性相関出力アダプタの構成用ルート要素は、ha-correlating-adapterです。特定のアダプタのname子要素は、次に示すように、このアダプタが宣言されているEPNアセンブリ・ファイル内の対応するwlevs:adapter要素のid属性と一致している必要があります。

<ha:ha-correlating-adapter>
<name>myCorrelatingAdapter</name>
<window-length>15000</window-length>
<warm-up-window-length units="minutes">6</warm-up-window-length>
</ha:ha-correlating-adapter>

表17-14は、子要素を説明しています。

表17-14 子要素

子要素

説明

fail-over-delay

フェイルオーバー後に相関関係が再起動される速さを決定するために使用される、遅延タイムアウトをミリ秒単位で指定します。

デフォルト: 0ミリ秒

warm-up-window-length

以前に失敗したセカンダリの再起動後または新しいセカンダリがunitsの整数の数として追加された後、アプリケーションが状態を再構築するのにかかる時間の長さを指定します。

units属性の有効な値:

- seconds: 指定された秒数を待機します。

- minutes: 指定された分数を待機します。

デフォルト: unitsはsecondsです。

詳細は、「適切なwarm-up-window-length時間の選択」を参照してください。

window-length

イベントの保存されたバッファの長さ(ミリ秒単位)。

trimming-interval

セカンダリ・バッファからイベントをトリミングする必要のある間隔。単位はeventsまたはmillisです。

heartbeat

このアダプタにおけるハートビート・タイムアウトの値。ハートビートは、このアダプタでイベントが生成されずにn時間単位が経過すると生成されます。デフォルトの時間単位はナノ秒です。

batch-size

イベント・タイムスタンプをセカンダリに送信するときのバッチ・サイズ(イベント数単位)。デフォルトでは、バッチ処理は無効です。

18 スケーラブル・アプリケーション

パーティション化と並列処理を使用して、また高可用性オプションを考慮して、アプリケーション設計にスケーラビリティを組み込むことができます。Oracle Stream Analyticsでは、チャネルとアップストリーム・アダプタでデフォルトまたはカスタムのパーティション化および並列処理設定を使用できます。着信JMSイベント・ストリームをパーティション化し、JSMSイベント・ストリームのグループ・パターン・マッチングを構成することもできます。

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

- デフォルト・チャネルのスケーラビリティ設定

- 着信JMSイベント・ストリームのパーティション化

- 通知グループの命名規則

- カスタム・チャネル・イベント・パーティショナ

18.1 デフォルト・チャネルのスケーラビリティ設定

デフォルト・イベントのプロパティ・ベースのイベント・パーティショナを使用するようチャネルを構成できます。このデフォルト構成では、着信イベントが到着するたびに、チャネルはリスナーを選択し、各リスナーに各イベントをブロードキャストするかわりに、そのリスナーにイベントをディスパッチします。

注:

イベント・パーティショナでチャネルを構成した場合、バッチ処理はサポートされていません。

図18-1に、イベント・パーティショナのプロパティを使用してチャネルをパーティション化するEPNを示します。この例では、株式銘柄と株価の2つのプロパティを持つPriceEventタイプのイベントをインバウンド・アダプタが送信します。この例は、symbolプロパティでチャネルをパーティション化し、チャネルまたはアップストリーム・アダプタにマルチスレッド処理を追加する方法を示しています。

図18-1 EventPartitioner EPN

- チャネルでのパーティション化の構成

- チャネルでの並列処理の構成

- アップストリーム・アダプタでの並列処理の構成

- ローカル・パーティション・チャネルの定義

18.1.1 チャネルでのパーティション化の構成

イベント・ストアのカスタマイズの詳細は、『Oracle Stream Analyticsのカスタマイズ』のイベント・ストアのカスタマイズに関する項を参照してください。

1. EPNにチャネルを追加します。

図18-1では、チャネルはEventPartitionerChannelです。

2. チャネルをアップストリーム・アダプタに接続します。

図18-1では、アップストリーム・アダプタはinboundです。

3. チャネルを複数のリスナーに接続します。

図18-1では、チャネルはOracle CQLプロセッサprocessor1、processor2およびprocessor3に接続されます。

4. partitionByEventPropertyのインスタンス・プロパティをチャネル要素に追加するようにアセンブリ・ファイルを編集します。

このinstance-propertyのvalueはチャネルがイベントをパーティション化するイベント・プロパティの名前です。

この例では、チャネルはイベント・プロパティsymbol別にイベントをパーティション化します。

<wlevs:event-type-repository>
<wlevs:event-type type-name="PriceEvent">
<wlevs:properties>
<wlevs:property name="symbol" type="char" />
<wlevs:property name="price" type="long" />
</wlevs:properties>
</wlevs:event-type>
</wlevs:event-type-repository>

<wlevs:channel id="EventPartitionerChannel" event-type="PriceEvent">
<wlevs:instance-property name="partitionByEventProperty" value="symbol" />
<wlevs:listener ref="processor1" />
<wlevs:listener ref="processor2" />
<wlevs:listener ref="processor3" />
<wlevs:source ref="inbound" />
</wlevs:channel>

18.1.2 チャネルでの並列処理の構成

チャネルでスレッドを割り当てる場合、max-threadsプロパティをEPNのリスナー数に設定します。

チャネルから並列性ダウンストリームを増やす場合には、チャネルでmax-threadsプロパティを設定して、スレッド・プールにチャネルを関連付けます。スレッドの最大数として最適な値は、ダウンストリーム・プロセッサにおけるOracle CQL問合せの詳細(問合せでパラレル実行を許可するかどうか)や、アプリケーションの実行中に観察される動作(CPUコアをすべて使用するかどうか)など、多くの要素に依存します。スレッドの最大数をチューニングするには、手始めとしてチャネルでのリスナー数と等しく設定することをお薦めします。

この例では、リスナー数は3つです。

<wlevs:channel id="EventPartitionerChannel" event-type="PriceEvent" max-threads="3" >
<wlevs:instance-property name="eventPartitioner" value="true" />
<wlevs:listener ref="processor1" />
<wlevs:listener ref="processor2" />
<wlevs:listener ref="processor3" />
<wlevs:source ref="inbound" />
</wlevs:channel>

18.1.3 アップストリーム・アダプタでの並列処理の構成

1. EPNアセンブリ・ファイルを編集し、max-threads属性を0に設定するようチャネルを構成します。

<wlevs:channel id="EventPartitionerChannel" event-type="PriceEvent"
max-threads="0" >
<wlevs:instance-property name="eventPartitioner" value="true" />
<wlevs:listener ref="processor1" />
<wlevs:listener ref="processor2" />
<wlevs:listener ref="processor3" />
<wlevs:source ref="inbound" />
</wlevs:channel>

2. Oracle Stream Analyticsサーバー・ファイルを編集し、work-manager要素を追加します。

ワーク・マネージャに対するmin-threads-constraintとmax-threads-constraintの適切な選択は、チャネルでのスレッド数の設定に関してチャネルでの並列処理の構成で説明している要素や、ワーク・マネージャを特定のアダプタ専用にするか、それとも他のコンポーネント(他のアダプタまたはJettyサービス)と共有するかなど、多くの要素に依存します。チューニングの手始めとして、ワーク・マネージャが単一のアダプタ・インスタンス専用の場合には、min-threads-constraintおよびmax-threads-constraintプロパティを、アダプタからのダウンストリームのリスナー数と等しく設定することをお薦めします。

このワーク・マネージャが複数のコンポーネントで共有されていない場合(つまり、この構成のアップストリーム・アダプタ専用の場合)、min-threads-constraintおよび max-threads-constraint要素をリスナー数と同じ値に設定します。

<work-manager>
<name>adapterWorkManager</name>
<min-threads-constraint>3</min-threads-constraint>
<max-threads-constraint>3</max-threads-constraint>
</work-manager>

max-threadsの詳細は、『Oracle Stream Analyticsスキーマ・リファレンス』のmax-threadsに関する項を参照してください。

3. コンポーネント構成ファイルを編集し、このwork-managerでアップストリーム・アダプタを構成します。

<adapter>
<name>inbound</name>
<work-manager-name>adapterWorkManager</work-manager-name>
...
</adapter>

18.1.4 ローカル・パーティション・チャネルの定義

ローカル・パーティション化をサポートするには、Oracle CQLプロセッサを構成する必要があります。

次に示すサンプル・コードを使用して、ローカル・パーティション化を定義します。

例18-1 アセンブリ・ファイル

<wlevs:channel id="LocalPartitionChannel" event-type="StockEvent" is-local-partitioner="true" max-threads="3">
<wlevs:instance-property name="partitionByEventProperty" value="symbol" />
</wlevs:channel>

重要なチャネル・プロパティ

ローカル・パーティション・チャネルには、次の重要なプロパティがあります。

- IS-LOCAL PARTITIONER: ローカル・パーティション化チャネルにするチャネルを定義します。

- MAX-THREADS: 並列度を指定します

- MAX-SIZE: バッファリングするイベントの最大数をパーティションごとに決定します。

- PARTITIONING ATTRIBUTE: ストリームのパーティション化に使用するストリームの属性を指定します。

例18-2 構成

<processor>
<name>StockAggregateProcessor</name>
<rules>
<query id="helloworldRule">
<![CDATA[
select count(*) as symbolCount, symbol from LocalPartitionChannel group by symbol]]>
</query>
</rules>
</processor>

18.2 着信JMSイベント・ストリームのパーティション化

マルチサーバー・ドメインのセレクタによって、ActiveActiveGroupBeanクラスをアセンブリ・ファイルに追加し、着信JMSイベント・ストリームをパーティション化できます。

- 高可用性のないパーティション化の構成

- 高可用性のあるパーティション化の構成

18.2.1 高可用性のないパーティション化の構成

1. マルチサーバー・ドメインを作成します。
この例では、デプロイメント・グループ名は、MyDeploymentGroupです。

Oracle Stream Analyticsの管理のマルチサーバー・ドメインに関する項を参照してください。

2. 適切なActiveActiveGroupBean通知グループをcluster要素のgroups子要素に追加するように各Oracle Stream AnalyticsサーバーのOracle Stream Analyticsサーバー構成ファイルを構成します。
Oracle Stream Analyticsサーバー構成ファイルは、/Oracle/Middleware/my_oep/user_projects/domains/<domain_name>/<server_name>/config.にあります。

表18-2は、ocep-server-1、ocep-server-2、ocep-server-3およびocep-server-4のOracle Stream Analyticsサーバーのcluster要素を示します。デプロイメント・グループはMyDeploymentGroupであり、通知グループはデフォルトのActiveActiveGroupBean通知グループ・ネーミングを使用して定義します。

オプションとして、通知グループの命名規則の説明に従って、独自のグループ命名規則を指定できます。

表18-1 サーバー構成ファイル・グループ要素構成

パーティション

cluster要素

ocep-server-1

<cluster>
<server-name>ocep-server-1</server-name>
...
<enabled>coherence</enabled>
...
<groups>MyDeploymentGroup, ActiveActiveGroupBean_group1</groups>
</cluster>

ocep-server-2

<cluster>
<server-name>ocep-server-2</server-name>
...
<enabled>coherence</enabled>
...
<groups>MyDeploymentGroup, ActiveActiveGroupBean_group2</groups>
</cluster>

ocep-server-3

<cluster>
<server-name>ocep-server-3</server-name>
...
<enabled>coherence</enabled>
...
<groups>MyDeploymentGroup, ActiveActiveGroupBean_group3</groups>
</cluster>

ocep-server-4

<cluster>
<server-name>ocep-server-4</server-name>
...
<enabled>coherence</enabled>
...
<groups>MyDeploymentGroup, ActiveActiveGroupBean_group4</groups>
</cluster>

3. Oracle Stream Analyticsアプリケーションを作成します。

4. 次のように、ActiveActiveGroupBean要素をアセンブリ・ファイルに追加します。

<bean id="clusterAdapter" class="com.oracle.cep.cluster.hagroups.ActiveActiveGroupBean">
</bean>

5. JMSインバウンド・アダプタのjms-adapter要素にパラメータ化されたmessage-selectorを定義します。

a. JMSインバウンド・アダプタのjms-adapter要素にgroup-binding子要素を追加するために、コンポーネント構成ファイルを編集します。

b. 各可能JMSメッセージ・セレクタ値に対して、次のように1つのgroup-binding要素を追加します。

<jms-adapter>
<name>JMSInboundAdapter</name>
<event-type>StockTick</event-type>
<jndi-provider-url>t3://ppurich-pc:7001</jndi-provider-url>
<destination-jndi-name>./Topic1</destination-jndi-name>
<user>weblogic</user>
<password>weblogic1</password>
<work-manager>JettyWorkManager</work-manager>
<concurrent-consumers>1</concurrent-consumers>
<session-transacted>true</session-transacted>
<message-selector>${CONDITION}</message-selector>
<bindings>
<group-binding group-id="ActiveActiveGroupBean_group1">
<param id="CONDITION">acctid > 400</param>
</group-binding>
<group-binding group-id="ActiveActiveGroupBean_group2">
<param id="CONDITION">acctid BETWEEN 301 AND 400</param>
</group-binding>
<group-binding group-id="ActiveActiveGroupBean_group3">
<param id="CONDITION">acctid BETWEEN 201 AND 300</param>
</group-binding>
<group-binding group-id="ActiveActiveGroupBean_group4">
<param id="CONDITION">acctid <= 200</param>
</group-binding>
</bindings>
</jms-adapter>

この構成では、ActiveActiveGroupBean_group1を含むcluster要素、groups子要素でアプリケーションをOracle Stream Analyticsサーバーにデプロイすると、CONDITIONパラメータがacctid > 400と定義され、acctidプロパティが400以上であるイベントがアプリケーションにより処理されます。

注:

各インバウンドJMSアダプタは異なるトピックをリスニングする必要があります。詳細は、アダプタを参照してください。

6. マルチサーバー・ドメインのデプロイメント・グループにアプリケーションをデプロイします。
実行時に、各Oracle Stream AnalyticsサーバーがActiveActiveGroupBean通知グループに対するmessage-selectorにアプリケーションのインスタンスを構成します。これにより、アプリケーションの各インスタンスがメッセージ総数のサブセットを並行して処理するようにJMSトピックがパーティションされます。

18.2.2 高可用性のあるパーティション化の構成

この手順では、JMSによる正確なリカバリの構成からのサンプル・アプリケーションを使用します。図18-2はEPN図を示し、例18-3および例18-4は、対応するアセンブリと構成ファイルを示します。

図18-2 JMSのEPNによる正確なリカバリ

この手順により、図18-3に示すOracle Stream Analyticsの高可用性構成が作成されます。

図18-3 高可用性のあるActiveActiveGroupBean

高可用性のあるJMSアプリケーションでのスケーラビリティの構成

1. マルチサーバー・ドメインを作成します。
この例では、デプロイメント・グループの名前は、MyDeploymentGroupです。

Oracle Stream Analyticsの管理のマルチサーバー・ドメインに関する項を参照してください。

2. 適切なActiveActiveGroupBean通知グループをcluster要素のgroups子要素に追加するように各Oracle Stream AnalyticsサーバーのOracle Stream Analyticsサーバー構成ファイルを構成します。
Oracle Stream Analyticsサーバー構成ファイルは、/Oracle/Middleware/my_oep/user_projects/domains/<domain_name>/<server_name>/config.にあります。

表18-2は、ocep-server-1、ocep-server-2、ocep-server-3およびocep-server-4のOracle Stream Analyticsサーバーのcluster要素を示します。デプロイメント・グループはMyDeploymentGroupであり、通知グループはデフォルトのActiveActiveGroupBean通知グループ・ネーミングを使用して定義します。

ocep-server-1とocep-server-2は同一の通知グループ名前(ActiveActiveGroupBean_group1)を使用し、ocep-server-3とocep-server-4は同一の通知グループ名前(ActiveActiveGroupBean_group2)を使用します。

表18-2 サーバー構成ファイル・グループ要素構成

パーティション

cluster要素

ocep-server-1

<cluster>
<server-name>ocep-server-1</server-name>
...
<enabled>coherence</enabled>
...
<groups>MyDeploymentGroup, ActiveActiveGroupBean_group1</groups>
</cluster>

ocep-server-2

<cluster>
<server-name>ocep-server-2</server-name>
...
<enabled>coherence</enabled>
...
<groups>MyDeploymentGroup, ActiveActiveGroupBean_group1</groups>
</cluster>

ocep-server-3

<cluster>
<server-name>ocep-server-3</server-name>
...
<enabled>coherence</enabled>
...
<groups>MyDeploymentGroup, ActiveActiveGroupBean_group2</groups>
</cluster>

ocep-server-4

<cluster>
<server-name>ocep-server-4</server-name>
...
<enabled>coherence</enabled>
...
<groups>MyDeploymentGroup, ActiveActiveGroupBean_group2</groups>
</cluster>

3. Oracle Stream Analytics高可用性アプリケーションを作成します。
詳細は、高可用性アプリケーションを参照してください。

4. 次のように、ActiveActiveGroupBean要素をアセンブリ・ファイルに追加します。

<bean id="clusterAdapter" class="com.oracle.cep.cluster.hagroups.ActiveActiveGroupBean">
</bean>

5. コンポーネント構成ファイルを編集し、次に示すように、インバウンドJMSアダプタ用のjms-adapter要素を構成します。
異なるトピックをリスニングするには、インバウンドJMSアダプタをそれぞれ設定し、session-transactedをtrueに設定する必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<wlevs:config
xmlns:wlevs="http://www.bea.com/ns/wlevs/config/application"
xmlns:ha="http://www.oracle.com/ns/cep/config/cluster">
...
<jms-adapter>
<name>JMSInboundAdapter</name>
<event-type>StockTick</event-type>
<jndi-provider-url>t3://ppurich-pc:7001</jndi-provider-url>
<destination-jndi-name>./Topic1</destination-jndi-name>
<session-transacted>true</session-transacted>
...    </jms-adapter>
<jms-adapter>
<name>JMSInboundAdapter2</name>
<event-type>StockTick</event-type>
<jndi-provider-url>t3://ppurich-pc:7001</jndi-provider-url>
<destination-jndi-name>./Topic2</destination-jndi-name>
<session-transacted>true</session-transacted>
...    </jms-adapter>
</wlevs:config>

6. 各JMSインバウンド・アダプタのjms-adapter要素にパラメータ化されたmessage-selectorを定義します。

a. JMSインバウンド・アダプタのjms-adapter要素にgroup-binding子要素を追加するために、コンポーネント構成ファイルを編集します。

b. 各可能JMSmessage-selector値に対して、次のように1つのgroup-binding要素を追加します。

<jms-adapter>
<name>JMSInboundAdapter</name>
<event-type>StockTick</event-type>
<jndi-provider-url>t3://ppurich-pc:7001</jndi-provider-url>
<destination-jndi-name>./Topic1</destination-jndi-name>
<session-transacted>true</session-transacted>
<message-selector>${CONDITION}</message-selector>
<bindings>
<group-binding group-id="ActiveActiveGroupBean_group1">
<param id="CONDITION">acctid <= 1000</param>
</group-binding>
<group-binding group-id="ActiveActiveGroupBean_group2">
<param id="CONDITION">acctid > 1000</param>
</group-binding>
</bindings>
</jms-adapter>

この構成では、ActiveActiveGroupBean_group1を含むcluster要素、groups子要素を持つアプリケーションをOracle Stream Analyticsサーバーにデプロイすると、CONDITIONパラメータがacctid <= 1000と定義され、acctidプロパティが1000以下であるイベントがアプリケーションにより処理されます。同様に、ActiveActiveGroupBean_group2を含むcluster要素、groups子要素を持つアプリケーションをOracle Stream Analyticsサーバーにデプロイすると、CONDITIONパラメータがacctid > 1000と定義され、acctidプロパティが1000以上であるイベントがアプリケーションにより処理されます。

7. コンポーネント構成ファイルを編集し、次に示すように、アウトバウンドJMSアダプタ用のjms-adapter要素を構成します。
対応するインバウンド・アダプタ(この例では、JMSInboundAdapter2: ./Topic2)と同一トピックでアウトバウンドJMSアダプタを構成し、session-transactedをtrueに設定します。

<?xml version="1.0" encoding="UTF-8"?>
<wlevs:config
xmlns:wlevs="http://www.bea.com/ns/wlevs/config/application"
xmlns:ha="http://www.oracle.com/ns/cep/config/cluster">
...
<jms-adapter>
<name>JMSInboundAdapter</name>
<event-type>StockTick</event-type>
<jndi-provider-url>t3://ppurich-pc:7001</jndi-provider-url>
<destination-jndi-name>./Topic1</destination-jndi-name>
<session-transacted>true</session-transacted>
...    </jms-adapter>
<jms-adapter>
<name>JMSInboundAdapter2</name>
<event-type>StockTick</event-type>
<jndi-provider-url>t3://ppurich-pc:7001</jndi-provider-url>
<destination-jndi-name>./Topic2</destination-jndi-name>
<session-transacted>true</session-transacted>
...    </jms-adapter>
<jms-adapter>
<name>JMSOutboundAdapter</name>
<event-type>StockTick</event-type>
<jndi-provider-url>t3://ppurich-pc:7001</jndi-provider-url>
<destination-jndi-name>./Topic2</destination-jndi-name>
<session-transacted>true</session-transacted>
...    </jms-adapter>
</wlevs:config>

8. マルチサーバー・ドメインのデプロイメント・グループにアプリケーションをデプロイします。
実行時に、各Oracle Stream AnalyticsサーバーがActiveActiveGroupBean通知グループに対するmessage-selectorにアプリケーションのインスタンスを構成します。これにより、アプリケーションの各インスタンスがメッセージ総数のサブセットを並行して処理するようにJMSトピックがパーティションされます。

ActiveActiveGroupBeanグループの有効なOracle Stream Analyticsサーバーが停止すると、そのActiveActiveGroupBeanグループのスタンバイOracle Stream Analyticsサーバーに対してOracle Stream AnalyticsサーバーがOracle Stream Analytics高可用性フェイルオーバーを実行します。

例18-3 JMS EPNアセンブリ・ファイルを使用して精度の高いリカバリ

<?xml version="1.0" encoding="UTF-8"?>
<beans ... >

<wlevs:event-type-repository>
<wlevs:event-type type-name="StockTick">
<wlevs:properties>
<wlevs:property name="lastPrice" type="double" />
<wlevs:property name="symbol" type="char" />
</wlevs:properties>
</wlevs:event-type>
</wlevs:event-type-repository>

<wlevs:adapter id="JMSInboundAdapter" provider="jms-inbound">
<wlevs:listener ref="myHaInputAdapter"/>
</wlevs:adapter>

<wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
<wlevs:instance-property name="keyProperties" value="sequenceNo"/>
<wlevs:instance-property name="timeProperty" value="inboundTime"/>
</wlevs:adapter>

<wlevs:channel id="channel1" event-type="StockTick">
<wlevs:listener ref="processor1" />
<wlevs:source ref="myHaInputAdapter"/>
<wlevs:application-timestamped>
<wlevs:expression>inboundTime</wlevs:expression>
</wlevs:application-timestamped>
</wlevs:channel>

<wlevs:processor id="processor1">
<wlevs:listener ref="channel2" />
</wlevs:processor>

<wlevs:channel id="channel2" event-type="StockTick">
<wlevs:listener ref="myHaCorrelatingAdapter" />
</wlevs:channel>

<wlevs:adapter id="myHaCorrelatingAdapter" provider="ha-correlating" >
<wlevs:instance-property name="correlatedSource" ref="clusterCorrelatingOutstream"/>
<wlevs:instance-property name="failOverDelay" value="2000"/>
<wlevs:listener ref="JMSOutboundAdapter"/>
</wlevs:adapter>

<wlevs:adapter id="JMSOutboundAdapter" provider="jms-outbound">
</wlevs:adapter>

<wlevs:adapter id="JMSInboundAdapter2" provider="jms-inbound">
</wlevs:adapter>

<wlevs:channel id="clusterCorrelatingOutstream" event-type="StockTick" advertise="true">
<wlevs:source ref="JMSInboundAdapter2"/>
</wlevs:channel>
</beans>

例18-4 JMSコンポーネント構成アセンブリ・ファイルを使用して精度の高いリカバリ

<?xml version="1.0" encoding="UTF-8"?>
<wlevs:config
xmlns:wlevs="http://www.bea.com/ns/wlevs/config/application"
xmlns:ha="http://www.oracle.com/ns/cep/config/cluster">
<processor>
<name>processor1</name>
<rules>
<query id="helloworldRule">
<![CDATA[ select * from channel1 [Now] >
</query>
</rules>
</processor>
<jms-adapter>
<name>JMSInboundAdapter</name>
<event-type>StockTick</event-type>
<jndi-provider-url>t3://ppurich-pc:7001</jndi-provider-url>
<destination-jndi-name>./Topic1</destination-jndi-name>
<session-transacted>true</session-transacted>
...
</jms-adapter>
<jms-adapter>
<name>JMSInboundAdapter2</name>
<event-type>StockTick</event-type>
<jndi-provider-url>t3://ppurich-pc:7001</jndi-provider-url>
<destination-jndi-name>./Topic2</destination-jndi-name>
<session-transacted>true</session-transacted>
...
</jms-adapter>
<jms-adapter>
<name>JMSOutboundAdapter</name>
<event-type>StockTick</event-type>
<jndi-provider-url>t3://ppurich-pc:7001</jndi-provider-url>
<destination-jndi-name>./Topic2</destination-jndi-name>
<session-transacted>true</session-transacted>
...
</jms-adapter>
</wlevs:config>

18.3 通知グループの命名規則

デフォルトでは、ActiveActiveGroupBeanクラスは次の名前で通知グループを作成します。Xは文字列です。

ActiveActiveGroupBean_X

実行時に、ActiveActiveGroupBeanは、Oracle Event Processingサーバーに定義された既存のグループをスキャンし、次のデフォルトのパターン一致を適用します。ActiveActiveGroupBeanで一致が見つかったら、その名前の通知グループを作成します。

ActiveActiveGroupBean_\\w+

オプションで、別の通知グループ・ネーミング・パターンを指定するために独自のグループ・パターンを定義できます。

1. アセンブリ・ファイルを構成し、次に示すように、ActiveActiveGroupBean要素にgroupPattern属性を追加します。

<bean id="clusterAdapter" class="com.oracle.cep.cluster.hagroups.ActiveActiveGroupBean">
<property name="groupPattern" value="MyNotificationGroupPattern*"/>
</bean>

2. 通知グループに対し使用するクラスタ・グループ・ネーミング・ルールに一致するgroupPattern属性の値を指定します。

18.4 カスタム・チャネル・イベント・パーティショナ

ほとんどのチャネルはデフォルト・イベントのパーティション化を使用します。パーティショナが指定されていなく、partitionByEventProperty要素が存在しない場合、チャネルはすべてのリスナーにイベントを送信します。partitionByEventProperty要素では、デフォルトのパーティション化アルゴリズムを使用して、指定したイベントをパーティション化することによって、一定レベルのカスタマイズを指定します。この項では、デフォルトのパーティション化アルゴリズムに対する制御を微調整するカスタム・パーティショナをプログラム的に構成することによって、チャネル・リスナーへのイベントのディスパッチをさらにカスタマイズする方法について説明します。たとえば、プロパティ範囲に基づいてイベント・パーティショナを作成できます。

18.4.1 EventPartitionerインタフェース

チャネルにまたがってイベントをパーティション化し、チャネル・リスナーへのイベントのディスパッチをカスタマイズするには、com.bea.wlevs.channel.EventPartitionerインタフェースを使用します。

注:

カスタム・パーティション化と並列処理を実装する際には、イベントの順序を維持し、マルチスレッドを慎重に管理するコードを必ず追加してください。

図18-4に、イベント・パーティショナを使用してチャネルをパーティション化するEPNを示します。この例では、株式銘柄と株価の2つのプロパティを持つPriceEventタイプのイベントをインバウンド・アダプタが送信します。この例は、symbolプロパティでチャネルをパーティション化し、チャネルまたはアップストリーム・アダプタにマルチスレッド処理を追加する方法を示しています。

図18-4 イベント・パーティショナEPN

18.4.2 EventPartitionerインタフェースの実装

1. Oracle JDeveloperで、Oracle Stream Analyticsアプリケーションを開きます。

2. MANIFEST.MFファイルを編集し、パッケージcom.bea.wlevs.channelをインポートします。

3. プロジェクトを選択し、「ファイル」→「新規」→「ギャラリから」を選択します。

「新規ギャラリ」ダイアログが表示されます。

4. 「新規ギャラリ」ダイアログで、左パネルから「一般」を、右パネルから「Javaクラス」を選択して、「OK」をクリックします。

「Javaクラスの作成」ダイアログが表示されます。

5. 「Javaクラスの作成」ダイアログで、クラス名、パッケージ名および拡張情報を指定します。

6. 「オプション属性」と「実装」の下で、「追加」(+)ボタンを使用してcom.bea.wlevs.channel.EventPartitionerインタフェースを指定します。

7. 「OK」をクリックします。

新しいEventPartitionerクラスが作成されます。

8. 次のように、EventPartitionerの実装を完了します。

package com.acme;

import com.bea.wlevs.channel.EventPartitioner;
import com.bea.wlevs.ede.api.EventProcessingException;
import com.bea.wlevs.ede.api.EventType;

public class MyEventPartitioner implements EventPartitioner {

private final EventType eventType;
private int numberOfPartitions;

@Override
public void activateConfiguration(int numberOfPartitions, EventType eventType) {
this.numberOfPartitions = numberOfPartitions;
this.eventType = eventType;
}

@Override
public int partition(Object event) throws EventProcessingException {
int dispatchToListener = 0;
... // Your implementation.
return dispatchToListener;
}
}

activateConfigurationメソッドは、ActivatableBean.afterConfigurationActiveの前、およびEventPartitionerクラスのpartitionメソッドの起動前にOracle Stream Analyticsサーバーが起動するコールバックです。

このEventPartitionerをチャネルと関連付ける場合、チャネルがイベントを受信するたびに、EventPartitionerクラスのpartitionメソッドが起動されます。

partitionメソッドは、チャネルによるイベントのディスパッチ先であるリスナーの索引を返す必要があります。索引は0からnumberOfPartitions - 1の間のintである必要があります。

9. EPNにチャネルを追加します。

図18-4では、チャネルはEventPartitionerChannelです。

10. チャネルをアップストリーム・アダプタに接続します。

図18-4では、アップストリーム・アダプタはinboundです。

11. チャネルを複数のリスナーに接続します。

図18-4では、チャネルはOracle CQLプロセッサprocessor1、processor2およびprocessor3に接続されます。

チャネルでロード・バランシングを実行する場合、各リスナーは同じである必要があります。

12. eventPartitionerのインスタンス・プロパティをチャネル要素に追加するようにEPNアセンブリ・ファイルを編集します。

このinstance-propertyのvalueはチャネルがイベントをパーティション化するためのEventPartitionerインスタンスの完全修飾クラス名です。このクラスは、Oracle Stream Analyticsアプリケーション・クラス・パスに存在する必要があります。

この例では、チャネルはEventPartitionerインスタンスcom.acme.MyEventPartitionerを使用してイベントをパーティション化します。

<wlevs:channel id="EventPartitionerChannel" event-type="PriceEvent"   max-threads="0" >
<wlevs:instance-property name="eventPartitioner"     value="com.acme.MyEventPartitioner" />
<wlevs:listener ref="filterFanoutProcessor1" />
<wlevs:listener ref="filterFanoutProcessor2" />
<wlevs:listener ref="filterFanoutProcessor3" />
<wlevs:source ref="PriceAdapter" />
</wlevs:channel>