この章では、Oracle Complex Event Processing(Oracle CEP)に関連する問題について説明します。内容は次のとおりです。
この項では、一般的な問題および回避方法について説明します。内容は次のとおりです。
表24-1に、11gリリース1(11.1.1)で非推奨のJava APIとその代替API(存在する場合)を示します。
表24-1 非推奨のJava API
非推奨のAPI | 代替API |
---|---|
|
|
|
|
|
|
|
|
イベントの記録および再生に関連する |
|
表24-2に、11gリリース1(11.1.1)で非推奨のOracle CEPスキーマとその代替スキーマ(存在する場合)を示します。
表24-2 非推奨のOracle CEPスキーマ
非推奨のスキーマ | アセンブリ・ファイルで非推奨か | コンポーネント構成ファイルで非推奨か | 代替スキーマ |
---|---|---|---|
|
はい |
はい |
|
|
はい |
N/A |
|
|
はい |
N/A |
|
|
はい |
N/A |
なし。 |
|
はい |
N/A |
なし。 |
|
N/A |
はい |
なし。 |
|
N/A |
はい |
なし。 |
|
N/A |
はい |
なし。 |
非推奨のOracle CQL構文の詳細は、次の項を参照してください。
アダプタのプログラミング・モデルの変更箇所は、次のとおりです。
アウトバウンド・アダプタ
以前はインバウンド・アダプタのみでしたが、現在はアウトバウンド・アダプタもあります。
アダプタのライフサイクル・コールバック・メソッド
アダプタのSpringタグには、現在、EPNアセンブリ・ファイルを通じてライフサイクル・コールバック・メソッドを設定するための属性が含まれます。
実行可能アダプタ
スレッドで実行するアダプタでは、現在、そのJavaクラスでcom.bea.wlevs.ede.api.RunnableBean
を実装する必要があります。
アダプタ・ファクトリ
プログラマは、アダプタの作成時にアダプタ・ファクトリを作成する必要がなくなりました。アダプタ・ファクトリを作成する必要があるのは、アプリケーション間でアダプタを共有する場合のみです。
アダプタ・プロバイダの公開
アダプタ・プロバイダは、OSGiサービス・レジストリを通じて公開されるアダプタのファクトリです。
以前は、アダプタ・プロバイダを公開する唯一の方法は、次のようにSpring-DMを使用することでした。
<osgi:service interface="com.bea.wlevs.ede.api.AdapterFactory" ref="myBean"> <osgi:service-properties> <entry key="type" value="SocketAdapterType"/> </osgi:service-properties> </osgi:service>
ただし、Spring-DMでは同じアプリケーションでのOSGiサービスのエクスポートとインポートがサポートされないため、前述の方法は非推奨です。
現在は、次のようにwlevs:factory
タグを使用してプロバイダを宣言する必要があります。
<wlevs:factory provider-name="SocketAdapterType" ref="myBean">
この方法は、アダプタが同じアプリケーションに存在するかどうかにかかわらず、動作します。
現在、アダプタとプロバイダが同一の場所に(両方とも同じアプリケーションに)存在する場合、プロバイダの使用はオプションです。アダプタは、直接インスタンス化できるためです。
この変更に従わないと、アプリケーションが起動せず、最終的にタイムアウトする可能性があります。
OracleStockTickに置き換えられたStockTickイベント・タイプ
loadgenアダプタを使用する場合、StockTick
イベントの名前がOracleStockTick
になったことに注意してください。
デプロイヤ・ツールの-start
および-stop
コマンドは、非推奨になりました。
-install
コマンドを使用してアプリケーションをインストールすると、Oracle CEPにより、すべての内部初期化タスクの完了後にそのアプリケーションが自動的に起動されます。その後、Oracle CEPサーバー・インスタンスを停止および起動すると、アプリケーションはそれに応じて自動的に停止および起動します。
デプロイヤ・ツールには、-suspend
および-resume
という2つの新規オプションがあります。現在実行中のアプリケーションを一時停止する場合には-suspend
を使用し、アプリケーションの実行を再開する場合には-resume
を使用してください。
詳細は、『Oracle CEP Administrator's Guide』のデプロイヤのコマンドライン・リファレンスに関する項を参照してください。
Oracle CEPの管理フレームワークは、今回のリリースで修正されました。
Oracle CEPでは、JRMPプロトコルがサポートされなくなりました。かわりに、JMXクライアントでは、Oracle CEP JMXサーバーにローカルおよびリモートからアクセスするために、よりセキュアなMSAプロトコルを使用する必要があります。localhost
上またはリモート・ホスト上で稼働するOracle CEP JMXサーバーに接続する場合、常にMSAコネクタを使用するように、必ずJMX URL service:jmx:msarmi://
HOST-NAME
:
PORT
/jndi/jmxconnector
を使用する必要があります(HOST-NAME
はlocalhost
またはリモート・ホスト名で、PORT
はOracle CEPサーバーのJNDIポートです)。
詳細は、次を参照してください。
『Oracle CEP Administrator's Guide』のOracle CEP JMXサーバーへのアクセスに関する項
『Oracle CEP Administrator's Guide』のJMXの構成に関する項
同じホストで2つのサーバーを起動する環境について検討します。たとえば、ポート9002でリスニングするサーバー1と、ポート9022でリスニングするサーバー2があるとします。このとき、サーバー1のドメイン・ディレクトリでstopwlevs.sh
を使用すると、ポート9002でリスニングするサーバーは停止します。その後、サーバー2のドメイン・ディレクトリでstopwlevs.sh
を使用すると、接続リセット・エラーのために停止操作に失敗します。
回避方法: stopwlevs.sh
コマンドラインの引数-url
または-listenPort
を使用して、9002以外のポートを指定します。
監視サービスは、アプリケーション・タイムスタンプ・チャネルが使用されており、is-totally-orderedが有効化されていない場合、CQLプロセッサを通じて処理されているイベントの待機時間を過少に見積る可能性があります。
(wlevsjconsole.sh
スクリプトの有無にかかわらず)JConsoleを使用してOracle CEPサーバーに接続すると、JConsoleでjava.lang.NullPointerException
がスローされることがあります。
回避方法: 例外のダイアログ・ボックスで「OK」をクリックし、操作を続けます。この例外は、JMX接続やOracle CEPサーバーに影響しません。
固定期間の非イベント・パターン検出は、11gリリース1(11.1.1)でサポートされます。固定期間の非イベント検出用の問合せを作成する場合、定数値と時間単位(DURATION 5 SECONDS
など)または定数値のみ(DURATION 5
など)を含むDURATION
句を使用できます。
可変期間の非イベント・パターン検出は、11gリリース1(11.1.1)でサポートされません。つまり、DURATION c1+4
などの任意の演算式を含むDURATION
句は、使用できません。
繰返しの非イベント・パターン検出は、11gリリース1(11.1.1)でサポートされますが、固定期間のみが対象です。つまり、MULTIPLES OF
句を含むDURATION
句は、使用できますが、定数値の期間のみが対象です。
この問題に関連するドキュメントの訂正箇所は、24.3.7項「今回のリリースでサポートされない可変期間の非イベント検出」を参照してください。
次のメソッドがcom.bea.wlevs.management.configuration.JMSAdapterMBean
に追加されました。
getConnectionUser
getConnectionPassword
getConnectionEncryptedPassword
次の属性がwlevs_application_config.xsd
の要素jms-adapter
に追加されました。
connection-user
connection-password
connection-encrypted-password
Oracle CEPでJNDI InitialContext
を取得する場合、user
およびpassword
(またはencrypted-password
)設定を使用します。
Oracle CEPでjavax.jms.ConnectionFactory
のcreateConnection
メソッドをコールしてJMS宛先(JMSキューまたはトピック)に対する接続を作成する場合、connection-user
およびconnection-password
(またはconnection-encrypted-password
)設定を使用します(構成されている場合)。それ以外の場合、Oracle CEPではuser
およびpassword
(またはencrypted-password
)設定を使用します。
1つのセキュリティ・プロバイダがJNDIアクセスに使用されており、もう1つのセキュリティ・プロバイダがJMSアクセスに使用されているアプリケーションでは、connection-user
およびconnection-password
(またはconnection-encrypted-password
)設定を使用できます。
この項では、構成に関する問題およびその回避方法について説明します。内容は次のとおりです。
24.2.5項「FirefoxおよびSSLによるOracle CEP Visualizerを使用したファイルのアップロード」
24.2.8項「Linux上のFireFox 3の必須ライブラリと互換性のないOracle CEP IDE for Eclipse」
WindowsでFirefoxブラウザ・バージョン3.0を使用してシグナル生成サンプル・ダッシュボード(URL http://localhost:9002/signalgeneration/dashboard.html
)にアクセスすると、「開始」のクリック時にエラーが発生します。
回避方法: Internet Explorerバージョン7を使用してシグナル生成サンプル・ダッシュボードにアクセスします。
デプロイ済アプリケーションのないドメインでサーバーを起動すると、サーバーが正常に起動しても、サーバー起動スクリプトを実行したコマンド・ウィンドウにサーバーの起動
を示すメッセージが表示されないことがあります。
アクティブなVPNソフトウェアは、マルチキャスト・トラフィックにおいて予期しない動作をすることが知られています。また、Cisco VPNとNortel VPNの両方をインストールすると、マルチキャスト・トラフィックに障害が発生します。
Firefoxブラウザ(バージョン3.0、SSLおよびJDK 1.6)でOracle CEP Visualizerを使用すると、Oracle CEP Visualizerのページに最初にアクセスしたときに、レンダリングに時間がかかります(最大30秒かかることもあります)。
Oracle CEP Visualizerの使用時に、FirefoxブラウザとSSLを使用してファイルをアップロードしようとすると、エラーが発生することがあります。
これは、Oracle CEP Visualizerに影響するAdobe Flexの既知の問題です(http://bugs.adobe.com/jira/browse/FP-226
)。
チャネルがOracle CQLプロセッサに接続されている場合、そのチャネルに外部ステージは使用できません。
FireFoxでOracle CEP Visualizerを使用する場合:
Jettyスクラッチ・ディレクトリに空白を含んだパスを設定しないでください。設定すると、FileNotFoundException
が発生します。
サーバー側でスローされるEOFException
は無視してください。これらの例外により、クライアント側で障害が発生することはありません。
Oracle CEP IDE for Eclipseでは、Linux上のFireFox 3の必須ライブラリと互換性のないEclipse 3.3を使用します。そのため、Eclipseは、起動時に次のようなJVMコア・ダンプおよびエラー・メッセージとともにクラッシュします。
# An unexpected error has been detected by Java Runtime Environment: # # SIGSEGV (0xb) at pc=0x00bc80ac, pid=18044, tid=3086637584 # # Java VM: Java HotSpot(TM) Client VM (11.3-b02 mixed mode, sharing linux-x86) # Problematic frame: # C [libc.so.6+0x710ac] memcpy+0x1c # # An error report file with more information is saved as: # /usr/local/bt/workspace/testruntime/eclipse/hs_err_pid18044.log
回避方法: 次の手順を実行します。
Linuxマシンでrootユーザーに変更します。
次のように、コア・ダンプ・エラー・メッセージに記録されているlibc.so
をEclipseでロードしないようにします。
mv libc.so libc.so.orig
注意: これにより、FireFox 3は現在のマシンで無効化されます。FireFox 3を使用するには、このライブラリの名前をlibc.so に戻す必要があります。 |
次のEclipse Linuxクラッシュ・サポートWikiページに記載されている指示に従います。
特に、Eclipseと組み合せて使用しているJVMが次の要件を満たしていることを確認します。
JVMがeclipse.ini
ファイルで明示的に指定されていること
JDK 1.6以上であること
IPv6と組み合せてLinux上でOracle CEPネイティブ・クラスタリングを使用すると、クラスタ・メンバーの再起動後に例24-1のようなエラーが発生することがあります。
例24-1 Oracle CEPサーバー・ログのevs4jエラー
<Error> <evs4j> <BEA-2049005> <The cluster member 3 is considered to have failed>
回避方法: 次の手順を実行します。
任意のエディタを使用して、関連するOracle CEPサーバー用のstartwlevs.sh
スクリプトを開きます。
startwlevs.sh
サーバー起動スクリプトは、メイン・ドメイン・ディレクトリ内のサーバー・ディレクトリにあります。たとえば、HelloWorldドメインのデフォルト・サーバー・ディレクトリの場所は、ORACLE_CEP_HOME
/ocep_11.1/samples/domains/helloworld_domain/defaultserver
です(ORACLE_CEP_HOME
は、/oracle_cep
などのメインのOracle CEPインストール・ディレクトリを示します)。
startwlevs.sh
スクリプトを編集し、次のように-Djava.net.preferIPv4Stack=true
プロパティをjava
コマンドラインに追加します。
"$JAVA_HOME/bin/java" $JVM_ARGS $DEBUG_ARGS -Djava.net.preferIPv4Stack=true -Dwlevs.home="$USER_INSTALL_DIR" -Dbea.home="$BEA_HOME" -jar "${USER_INSTALL_ DIR}/bin/wlevs.jar" $ARGS
startwlevs.sh
スクリプトを保存して閉じます。
変更したstartwlevs.sh
スクリプトを使用して、関連するOracle CEPサーバーを起動します。
loadgenユーティリティでは、ASCII文字のみがサポートされます。マルチバイト・キャラクタ・セットはサポートされません。
キーストアのパスワードとSSL秘密鍵の別名は、同じである必要があります。異なる場合、Oracle CEPサーバーは起動しません。
詳細は、24.3.12項「キーストアと秘密鍵のパスワードが異なる場合にOracle CEPサーバーが起動しない問題」を参照してください。
この項では、ドキュメントの訂正箇所を示します。内容は次のとおりです。
次の項のインストーラ・ファイルの名前は、間違っています。
『Oracle CEP Getting Started』のグラフィカル・モードでのOracle CEPのインストールに関する項
『Oracle CEP Getting Started』のコンソール・モードでのOracle CEPのインストールに関する項
表24-3に、サポートされる各プラットフォームの正しいインストーラ・ファイル名を示します。
『Oracle CEP Getting Started』のディストリビューション・キットで提供されるサンプルの概要に関する項には、次の情報が必要です。
「追加のOracle CEPサンプル・コードは、http://www.oracle.com/technology/sample_code/products/event-driven-architecture
で入手できます。」
『Oracle CEP CQL Language Reference』のColt集計関数に関する項には、次の関数の不完全な出力例が含まれます。
AUTOCORRELATION
DURBINWATSON
HARMONICMEAN
SAMPLESTANDARDDEVIATION
TRIMMEDMEAN
『Oracle CEP CQL Language Reference』のユーザー定義の単一行関数の実装方法に関する項の導入部分に、次の記載があります。
「ユーザー定義の単一行関数を実装するには、SingleElementFunctionインタフェースを実装するJavaクラスを実装します。」
正しくは、次のようになります。
「ユーザー定義の単一行関数を実装するには、パブリック・コンストラクタと、関数の実行時に起動されるパブリック・メソッドを提供するJavaクラスを実装します。」
この説明の手順2は、正しくは次のとおりです。
例24-2に示すとおり、ユーザー定義関数のJava実装クラスをコンパイルし、そのクラスをOracle CEPアプリケーション・アセンブリ・ファイルに登録します。
例24-2 Oracle CQLプロセッサ用のユーザー定義の単一行関数
<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>
wlevs:function
要素のexec-method
属性を使用して、関数の実行時に起動するメソッドを指定します。このメソッドは、パブリックであり、その名前で一意に識別される必要があります(つまり、オーバーライドされていないメソッドです)。
詳細は、『Oracle CEP IDE Developer's Guide for Eclipse』のwlevs:functionに関する項を参照してください。」
『Oracle CEP Visualizer User's Guide』のステージ構成の表示および変更に関する項には、JMSアダプタ・ステージに関するトピックが欠落しています。
『Oracle CEP Administrator's Guide』の個別モジュールの重大度の構成に関する項には、使用できる有効なロギング・コンポーネント名の定数が欠落しています。表24-4に、完全なリストを示します。
表24-4 ロギング・コンポーネント名の定数
コンポーネント名の定数 | 説明 |
---|---|
|
Oracle CEPサーバー上で稼働するアダプタ・インスタンスからのログ・メッセージに適用されます。 |
|
Oracle CEPサーバー上で稼働するキャッシュ・システムおよびキャッシュ・インスタンスからのログ・メッセージに適用されます。 |
|
Oracle CEPサーバー上で稼働するチャネルからのログ・メッセージに適用されます。 |
|
Oracle CEPサーバー上で稼働するOracle CQLプロセッサからのログ・メッセージに適用されます。 |
|
Oracle CEPサーバー上で稼働するEPLプロセッサからのログ・メッセージに適用されます。 |
|
イベントドリブン環境(Oracle CEPサーバーのイベント・ディスパッチ・インフラストラクチャ)からのログ・メッセージに適用されます。 |
|
<May 26, 2009 5:53:49 PM PDT> <Info> <EventTrace> <BEA-000000> <Application [helloworld], Stage [helloworldOutputChannel] received insert event>
<May 26, 2009 6:02:34 PM PDT> <Debug> <EventTrace> <BEA-000000> <Application [helloworld], Stage [helloworldOutputChannel] received insert event [HelloWorldEvent: HelloWorld - the current time is: 6:02:34 PM]> |
|
Oracle CEPサーバーおよびアプリケーション・ライフサイクル操作からのログ・メッセージに適用されます。 |
|
Oracle CEPサーバーの一般的なJMX関連の管理API操作からのログ・メッセージに適用されます。 |
|
Oracle CEPサーバーの監視サービスからのログ・メッセージに適用されます。 |
|
Oracle CEPサーバーのイベント記録および再生操作からのログ・メッセージに適用されます。 |
|
Springコンテナ操作からのログ・メッセージに適用されます。 |
|
Oracle CEPサーバー上で稼働するストリーム・インスタンスからのログ・メッセージに適用されます。 |
『Oracle CEP CQL Language Reference』のDURATION句に関する項には、非イベント検出用のDURATION
句の使用について記載されています。この項では、次の検出タイプを区別する必要があります。
固定期間の非イベント検出では、定数値と時間単位、または定数値のみを含むDURATION
句を使用します。
可変期間の非イベント検出では、任意の演算式を含むDURATION
句を使用します。
繰返しの非イベント検出では、MULTIPLES OF
句を含むDURATION
句を使用します。
固定期間の非イベント・パターン検出は、11gリリース1(11.1.1)でサポートされます。固定期間の非イベント検出用の問合せを作成する場合、定数値と時間単位(DURATION 5 SECONDS
など)または定数値のみ(DURATION 5
など)を含むDURATION
句を使用できます。
可変期間の非イベント・パターン検出は、11gリリース1(11.1.1)でサポートされません。つまり、DURATION c1+4
などの任意の演算式を含むDURATION
句は、使用できません。
繰返しの非イベント・パターン検出は、11gリリース1(11.1.1)でサポートされますが、固定期間のみが対象です。つまり、MULTIPLES OF
句を含むDURATION
句は、使用できますが、定数値の期間のみが対象です。
『Oracle CEP CQL Language Reference』の非イベント検出に関する項は、正しくは固定期間の非イベント検出に関する項になります。
『Oracle CEP CQL Language Reference』のDURATION句に関する項の次の例は、間違っています。正しくは次のようになります。
例15-8 DURATION句を含むMATCH_RECOGNIZEのストリーム出力
Timestamp Tuple Kind Tuple11000: + 10,8825000: + 10,38000: + 10,1850000: + 10,1962000: + 10,
例15-11 DURATION MULTIPLES OF句を含むMATCH_RECOGNIZEのストリーム出力
Timestamp Tuple Kind Tuple 11000: + 10,88,637 25000: + 10,, 38000: + 10,18,18 48000: + 10,19,37 58000: + 10,19,37 68000: + 10,20,57 82000: + 10,, 92000: + 10,,102000: + 10,,112000: + 10,,
例15-8の後にある次の段落は、間違っています。
「11000の時点までに到着する追加のタプルは、すべてB
に一致します。期間が10のため、1000+10000=11000
の時点で一致が出力されます。正規表現パターンAB*
のワイルド・カード*
は、可能なかぎり多くのB
と一致させることを示すため、B
に一致するタプルの最後が選択されます(値15を含むもの)。1000〜11000のタプルの順序は、パターンAB*
のみに一致しているため、一致は11000の時点でレポートされます。」
この記載は、正しくは次のとおりです。
「期間が10のため、1000+10000=11000
の時点で入力が取得されると同時に一致が出力されます(値12を含むもの)。1000〜9000のタプルの順序は、パターンAB*
のみに一致しているため、一致は11000の時点で入力が取得されると同時にレポートされます。」
『Oracle CEP CQL Language Reference』の比較条件に関する項には、非推奨の外部結合演算子(+)
について記載されています。(+)
結合演算子は使用しないことをお薦めします。後述するLEFT OUTER JOIN
およびRIGHT OUTER JOIN
構文を使用してください。
『Oracle CEP CQL Language Reference』の外部結合に関する項には、非推奨の外部結合演算子(+)
について記載されています。この項は、正しくは次のようになります。
外部結合は、単純な結合の結果を拡張します。外部結合は、結合条件を満たすすべての行を返すと同時に、一方の表の行が結合条件を満たさなくても、他方の表の一部または全部の行を返します。
例24-3は、ストリームS0
(スキーマ(c1 integer, c2 float)
付き)とS1
(スキーマ(c1 integer, c2 float)
付き)で左側外部結合を使用する問合せq5
の作成方法を示しています。
例24-3 外部結合
<query id="q5"><![CDATA[ SELECT a.c1+b.c1 FROM S0[range 5] AS a LEFT OUTER JOIN S1[range 3] AS b ON b.c2 = a.c2 WHERE b.c2 > 3 ]]></query>
ON
句を使用して結合条件を指定します。これにより、WHERE
句の検索条件またはフィルタ条件とは別に結合条件を指定できます。
次のタイプの外部結合を実行できます。
ストリームAおよびBの外部結合を実行し、Aからのすべてのストリーム要素を返す問合せ(左側外部結合)を記述するには、例24-4のようにFROM
句でLEFT OUTER JOIN
構文を使用します。Bのストリーム要素に一致しないAのすべてのストリーム要素に関して、Oracle CEPは、Bのストリーム要素を含む任意の選択リスト式に対してNULLを返します。
ストリームAおよびBの外部結合を実行し、Bからのすべてのストリーム要素を返す問合せ(右側外部結合)を記述するには、例24-5のようにFROM
句でRIGHT OUTER JOIN
構文を使用します。Aのストリーム要素に一致しないBのすべてのストリーム要素に関して、Oracle CEPは、Aのストリーム要素を含む任意の選択リスト式に対してNULLを返します。
『Oracle CEP Getting Started』のOracle CEPのインストールに関する項には、パッチ・クライアントの使用に関する情報が欠落しています。
詳細は、『Oracle Smart Update Installing Patches and Maintenance Packs』を参照してください。
『Oracle CEP Administrator's Guide』のOracle CEPネイティブ・クラスタリングを使用したOracle CEPマルチサーバー・ドメインの作成に関する項と、『Oracle CEP Administrator's Guide』のOracle Coherenceを使用したOracle CEPマルチサーバー・ドメインの作成に関する項には、次の手順が含まれます。
「パフォーマンスを向上するため、ドメイン内の1つを除くすべてのサーバーに対するOracle CEP Visualizerのアクセスを無効化することを検討してください。」
この記載は、正しくは次のとおりです。
「シングル・ポイント障害を回避するため、ドメイン内にあるn
台のマシンの小規模なサブセットでOracle CEP Visualizerを有効化することを検討してください。特定のOracle CEPサーバーでOracle CEP Visualizerを有効化すると、Oracle CEP Visualizerのワークロードによっては、サーバーのパフォーマンスが影響を受けます。」
『Oracle CEP Administrator's Guide』のグラフィカル・モードの構成ウィザードを使用したOracle CEPスタンドアロン・サーバー・ドメインの作成に関する項には、手順11に次の記載があります。
「Oracle CEPドメイン・アイデンティティ・キーストアのパスワードを入力して確認します。
デフォルトでは、証明書の秘密鍵のパスワードはアイデンティティ・キーストアと同じになります。異なるパスワードにする場合、キーストア・パスワードの使用の選択を解除し、秘密鍵のパスワードを入力します。」
この記載は、正しくは次のとおりです。
「Oracle CEPドメイン・アイデンティティ・キーストアのパスワードを入力して確認します。
デフォルトでは、証明書の秘密鍵のパスワードはアイデンティティ・キーストアと同じになります。異なる場合、Oracle CEPサーバーは起動しません。キーストア・パスワードの使用の選択を解除して秘密鍵のパスワードを入力しないでください。」
『Oracle CEP Administrator's Guide』のネットワーク・トラフィックを保護するためのSSLの構成に関する項には、次の手順が欠落しています。
デフォルトでは、構成ウィザードにより、evsidentity.jks
というデフォルトのキーストア証明書ファイルがDOMAIN_DIR
/
servername
/ssl
ディレクトリに作成されます。そのパスワードは、構成ウィザードでサーバーを作成したときに入力したものと同じです。オプションで、独自のキーストアを手動で作成できます。
キーストアを手動で作成する手順:
JDK keytoolコマンドを使用してキーストアを生成します。
keytool -genkey -alias evsidentity -keyalg RSA -validity 10958 -keystore evsidentity.jks -keysize 1024
プロンプトに従って、キーストアのパスワードを入力します。
Enter keystore password:
プロンプトに従って、キーストアの属性を入力します。
What is your first and last name? [Unknown]: CEP What is the name of your organizational unit? [Unknown]: SOA What is the name of your organization? [Unknown]: ORACLE What is the name of your City or Locality? [Unknown]: SF What is the name of your State or Province? [Unknown]: CA What is the two-letter country code for this unit? [Unknown]: US Is CN=CEP, OU=SOA, O=ORACLE, L=SF, ST=CA, C=US correct? [no]: y
キー・パスワードを要求されても、パスワードを入力せずに[Enter]
を押します。
Enter key password for <evsidentity> (RETURN if same as keystore password):
注意: 証明書の秘密鍵のパスワードがアイデンティティ・キーストアのパスワードと異なる場合、Oracle CEPサーバーは起動しません。 |
任意のXMLエディタを使用してOracle CEPサーバーのconfig.xml
ファイルを開きます。
デフォルトでは、構成ウィザードにより、ORACLE_CEP_HOME
/user_projects/domains/
DOMAIN_DIR
/
servername
/config
ディレクトリにconfig.xml
ファイルが作成されます(ORACLE_CEP_HOME
はd:/oracle_cep
などのOracle CEPインストール・ディレクトリを、DOMAIN_DIR
はmy_domain
などのドメイン・ディレクトリを、servername
はserver1
などのサーバー・インスタンス・ディレクトリを示します)。
ssl
要素を構成します。
例24-6に、構成ウィザードで作成されるデフォルトのssl
要素を示します。
例24-6 デフォルトのssl要素
<ssl> <name>sslConfig</name> <key-store>KEYSTORE_PATH
</key-store> <key-store-pass> <password>PASSWORD
</password> </key-store-pass> <key-store-alias>KEYSTORE_ALIAS
</key-store-alias> <key-manager-algorithm>SunX509</key-manager-algorithm> <ssl-protocol>TLS</ssl-protocol> <enforce-fips>false</enforce-fips> <need-client-auth>false</need-client-auth> </ssl>
変数の意味は次のとおりです。
KEYSTORE_PATH
は、キーストア・ファイルへのファイル・パスです(ファイル名は、keytoolコマンドの-keystore
引数に基づきます)。
PASSWORD
は、クリアテキストのキーストア・パスワードです。
KEYSTORE_ALIAS
は、キーストア別名です(keytoolコマンドの-alias
引数に基づきます)。
config.xml
ファイルを保存して閉じます。
encryptMSAConfig
ユーティリティを使用して、config.xml
ファイルのkey-store-pass
要素のpassword
子要素に含まれるクリアテキスト・パスワードを暗号化します。
『Oracle CEP Administrator's Guide』のencryptMSAConfigコマンドライン・ユーティリティに関する項を参照してください。
Oracle CEPでは、Colt関数のDurbinWatson
およびsampleStandardDeviation
はサポートされません。
次の項は省略してください。
『Oracle CEP CQL Language Reference』のDURBINWATSONに関する項
『Oracle CEP CQL Language Reference』のSAMPLESTANDARDDEVIATIONに関する項
次の項では、すべての組込み関数の名前を小文字にする必要があります。
『Oracle CEP CQL Language Reference』の単一行関数に関する項
『Oracle CEP CQL Language Reference』の集計関数に関する項
『Oracle CEP CQL Language Reference』のColt単一行関数に関する項
『Oracle CEP CQL Language Reference』のColt集計関数に関する項
『Oracle CEP CQL Language Reference』のjava.lang.Math関数に関する項
『Oracle CEP IDE Developer's Guide for Eclipse』のイベント・ソースおよびイベント・シンクに関する項には、非推奨のEventSource
およびEventSink
APIが記載されています。かわりに、API StreamSink
およびRelationSink
と、StreamSource
およびRelationSource
を使用する必要があります。
同様に、『Oracle CEP IDE Developer's Guide for Eclipse』
の次の項でも、非推奨のEventSource
およびEventSink
APIのかわりにAPI StreamSink
およびRelationSink
と、StreamSource
およびRelationSource
を使用する必要があります。
『Oracle CEP IDE Developer's Guide for Eclipse』のイベント・ソースとしてのアダプタまたはイベントBeanの実装に関する項は、正しくは次のようになります。
この項では、イベント・ソースとして機能するインバウンド・アダプタの作成方法について説明します。このアダプタは、着信データを受信し、EPNの次のコンポーネントに送信するイベントを生成します。イベントBeanは、機能的に同じものであるため、このガイドラインはイベント・ソースとして機能するイベントBeanのプログラミングにも適用されます。
インバウンド・アダプタ・クラスは、通常、マーケット・データ・フィードなどから着信データのストリームを読み取り、それを残りのアプリケーションが認識できるOracle CEPイベント・タイプに変換します。その後、そのイベントをネットワーク内の次のコンポーネントに送信します。
次の例は、HelloWorld
サンプルのアダプタ・クラスを示しています。太字のJavaコードに対応するコーディング・ガイドラインについて、例の後の説明を参照してください。
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; } }
アダプタJavaクラスをプログラミングする場合、次のガイドラインに従ってください(ガイドラインのコード・スニペットは、前述の例で太字で示されています)。
Oracle CEP APIのインタフェースとクラスをインポートします。
import com.bea.wlevs.ede.api.StreamSender; import com.bea.wlevs.ede.api.StreamSource; import com.bea.wlevs.ede.api.RunnableBean;
アダプタは、イベント・ソースであるため、StreamSource
インタフェースを実装する必要があります。アダプタをスレッドで実行する場合、RunnableBean
も実装する必要があります。StreamSender
インタフェースは、アプリケーション・ネットワーク内の次のコンポーネントにイベント・タイプを送信します。これらのAPIの詳細は、『Oracle CEP Java API Reference』を参照してください。
アプリケーションで使用されるイベント・タイプを表すアプリケーション固有のクラスをインポートします。
import com.bea.wlevs.event.example.helloworld.HelloWorldEvent
com.bea.wlevs.event.example.helloworld.HelloWorldEvent
クラスは、アプリケーションで使用されるイベント・タイプを表すJavaBeanです。
アダプタ・クラスは、イベント・ソースであり、独自のスレッドで実行するため、StreamSource
およびRunnableBean
インタフェースを実装する必要があります。
public class HelloWorldAdapter implements RunnableBean, StreamSource {
StreamSource
インタフェースは、イベントの送信に使用されるStreamSender
を提供します。
アダプタでは、RunnableBean
インタフェースを実装するため、run()
メソッドを実装する必要があります。
public void run() {...
この部分に、マーケット・フィードなどから着信データを読み取り、Oracle CEPイベント・タイプに変換して、そのイベントをネットワーク内の次のコンポーネントに送信するコードを配置する必要があります。着信データの読取り方法の詳細は、使用しているデータ・フィード・プロバイダのドキュメントを参照してください。ベンダーAPIがサード・パーティJARファイルにパッケージされている場合に、それらのAPIに確実にアクセスする方法の詳細は、サード・パーティJARファイルへのアクセスに関する項を参照してください。
HelloWorldの例では、アダプタ自体がgenerateHelloMessage()
プライベート・メソッドを使用して着信データを生成します。これは、単なる説明目的の例であり、現実的な使用例ではありません。generateHelloMessage()
メソッドには、次のように典型的な他のイベント・タイプ・プログラミング・タスクも含まれます。
HelloWorldEvent event = new HelloWorldEvent(); event.setMessage(message); eventSender.sendInsertEvent(event);
HelloWorldEvent
は、HelloWorldの例で使用されるイベント・タイプです。イベント・タイプは、JavaBeanで実装され、<wlevs:event-type-repository>
タグの使用によりEPNアセンブリ・ファイルに登録されます。詳細は、Oracle CEPイベント・タイプの作成に関する項を参照してください。setMessage()
メソッドは、イベントのプロパティを設定します。典型的なアダプタの実装では、この方法により、着信データの特定のプロパティをイベント・タイプのプロパティに変換します。最後に、StreamSender.sendEvent()
メソッドで、この新しいイベントをネットワーク内の次のコンポーネントに送信します。
アダプタではStreamSource
を実装するため、setEventSender()
メソッドを実装し、イベントの送信に使用されるStreamSender
を渡す必要があります。
public void setEventSender(StreamSender sender) { ...
よくあることですが、アダプタでSuspendableBean
を実装する場合、アプリケーションのアンデプロイ時などにアダプタを停止するsuspend()
メソッドを実装する必要があります。
public synchronized void suspend() throws Exception { ...
『Oracle CEP IDE Developer's Guide for Eclipse』のイベント・シンクとしてのアダプタまたはイベントBeanの実装に関する項は、正しくは次のようになります。
次のサンプル・コードは、イベント・シンクとして機能するHelloWorldアプリケーションのSpring Beanを示しています。太字のコードについて、例の後の説明を参照してください。
package com.bea.wlevs.example.helloworld; import com.bea.wlevs.ede.api.StreamSink; import com.bea.wlevs.event.example.helloworld.HelloWorldEvent; public class HelloWorldBean implements StreamSink { public void onInsertEvent(Object event) { if (event instanceof HelloWorldEvent) { HelloWorldEvent helloWorldEvent = (HelloWorldEvent) event; System.out.println("Message: " + helloWorldEvent.getMessage()); } } }
前述の例に示されているプログラミング・ガイドラインは、次のとおりです。
使用するBeanでは、アプリケーションのイベント・タイプ(HelloWorldの場合はHelloWorldEvent
)をインポートする必要があります。
import com.bea.wlevs.event.example.helloworld.HelloWorldEvent;
使用するBeanでは、com.bea.wlevs.ede.api.StreamSink
インタフェースを実装する必要があります。
public class HelloWorldBean implements StreamSink {...
StreamSink
インタフェースには、実装する必要のある単一のメソッド(onInsertEvent(java.lang.Object)
)が含まれます。このメソッドは、イベントを受信するためのコールバック・メソッドです。メソッドのパラメータは、イベントの送信元であるコンポーネントからBeanが受信した実際のイベントを表すObject
です。
public void onInsertEvent(Object event)
イベントのデータ型は、アプリケーションのEPNアセンブリ・ファイルに登録されているイベント・タイプにより決定されます。この例の場合、イベント・タイプはHelloWorldEvent
です。コードでは、受信したイベントが本当にHelloWorldEvent
であるかどうかを最初に確認します。
if (event instanceof HelloWorldEvent) { HelloWorldEvent helloWorldEvent = (HelloWorldEvent) event;
このイベント・タイプは、次のようなEPNアセンブリ・ファイルに構成されたJavaBeanです。
<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>
EPNアセンブリ・ファイルの作成手順の詳細は、EPNアセンブリ・ファイルの作成に関する項を参照してください。リファレンス情報は、付録D「スキーマ・リファレンス: EPNアセンブリspring-wlevs-v11_0_0_0.xsd」を参照してください。
イベントは、適切なJavaBeanのインスタンスであるため、標準のgetXXX()
メソッドを使用して個別のプロパティにアクセスします。この例では、HelloWorldEvent
にmessage
というプロパティがあります。
System.out.println("Message: " + helloWorldEvent.getMessage());
この項に記載されているOracle CEP APIの完全なAPIリファレンス情報は、『Oracle CEP Java API Reference』を参照してください。
『Oracle CEP IDE Developer's Guide for Eclipse』の@Activateアノテーションの例に関する項は、正しくは次のようになります。
package com.bea.wlevs.adapter.example.helloworld; ... import com.bea.wlevs.configuration.Activate; 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 { ... @Activate public void activateAdapter(HelloWorldAdapterConfig adapterConfig) { this.message = adapterConfig.getMessage(); } ... }
『Oracle CEP IDE Developer's Guide for Eclipse』の@Prepareアノテーションの例に関する項は、正しくは次のようになります。
package com.bea.wlevs.adapter.example.helloworld; ... import com.bea.wlevs.configuration.Prepare; 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 { ... @Prepare public void checkConfiguration(HelloWorldAdapterConfig adapterConfig) { if (adapterConfig.getMessage() == null || adapterConfig.getMessage().length() == 0) { throw new RuntimeException("invalid message: " + message); } } ... }
『Oracle CEP IDE Developer's Guide for Eclipse』の@Rollbackアノテーションの例に関する項は、正しくは次のようになります。
package com.bea.wlevs.adapter.example.helloworld; ... import com.bea.wlevs.configuration.Rollback; 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 { ... @Rollback public void rejectConfigurationChange(HelloWorldAdapterConfig adapterConfig) { }