デモの実行結果とチャート
デモを実行するには、株価更新アプリケーション、取引エンジン(リアルタイムと非リアルタイムの2バージョン)、およびJavaFXベースのチャートアプリケーションが必要です(すべて本稿冒頭のリンクからダウンロード可能)。株価データを転送するために標準Java EE JMSプロバイダが必要です。このデモでは、SunのJava EE 5アプリケーションサーバに付属するものを使用しました。設定を行うため、JMSトピックの送り先をjms/QuoteUpdatesという名前で作成してください。
OrderManagerの非リアルタイム版とリアルタイム版の違いを表示するため、チャート作成アプリケーションを実行します。このJavaFXアプリケーションでは、オープンソースのJFreeChartを使用します。
(メモ:このチャートアプリケーションのJavaFXバージョンを作成していただいたSunのJim Clarke氏に感謝します。)
図5に、非リアルタイムバージョンの取引エンジンからの出力を示します。多くの取引機会の喪失、金銭的損失、タイムクリティカルループの時間の揺れ(割り込みがあった証拠)、およびガベージコレクションイベント(グレーの垂直バー)があったことがわかります。全体として、これはサンプルの金融機関が資金を失ったことを意味します。
リアルタイムバージョンからの出力は、かなり違います(図6を参照)。失われた取引機会や金銭的損失がないことに注意してください。タイムクリティカルなループの時間は一定です(割り込みがない証拠)。また、ガベージコレクションイベント(グレーの垂直バー)は発生していますが、これはクリティカルな処理に影響していません。
デモアプリケーションの実行
デモを実行するには複数のステップが必要です。最初に実行するときは、準備に手間がかかります。最初に、Java RTS Version 2の評価版をダウンロードし、インストールします。Solaris 10が稼働するPC(x86/x64またはSPARCプロセッサ)にインストールする必要があります。やむをえない事情がある場合は、VMwareなどの仮想サーバソフトウェア上で稼働するSolaris 10にインストールすることもできますが、リアルタイムの動作は得られない可能性が大です。
次に、JMSプロバイダを設定し、実行します(jms/QuoteUpdatesトピックが定義されている必要があります)。取引の通知はJMX MBean通知としてチャートコンポーネントに送信されるため、このコンポーネントをJMSプロバイダとしてアプリケーションサーバと一緒に実行するのが最適です。
次に、以下のコマンドを使ってチャートアプリケーションを実行します(アプリケーションサーバを実行するサーバのIPアドレスは実際のものに置き換えます)。
java -jar dist/RTfx.jar com.sun.oss.trader.fx.Main -- -host <app server IP address>
(チャートアプリケーションは任意のコンピュータで実行できます。取引システムがあるSolaris 10コンピュータ上で実行しなければならないわけではありません)。
次に、取引エンジン(非リアルタイム版またはリアルタイム版)をSolarisのNetBeans内で開始します。Java RTSアプリケーションの開発は、任意のプラットフォームでNetBeansまたはEclipseを使って行えますが、SunからはSolaris上でJava RTSアプリケーションをデバッグするための専用NetBeansプラグインが提供されています。取引エンジンは、次のコマンドを使ってコマンドラインからでも実行できます。
- リアルタイムバージョン(Solaris 10で実行)
- 非リアルタイムバージョン(比較のためにSolaris 10で実行するが、必須ではない)
<path to JavaRTS>/bin/java ?jar dist/RTTradingEngine.jar
java ?jar dist/TradingEngine.jar
株式情報の更新を開始するには、Quote Publisherアプリケーションのディレクトリに移動し、次のコマンドを実行します(JMSプロバイダのJARファイルがclasspathに設定されていることが前提)。
java ?jar dist/QuotePublisher.jar
以上の順序でアプリケーションを開始すると、間もなく取引データが次々とチャートに表示されます。通常、非リアルタイムバージョンでは、ガベージコレクションイベントが損失(市場ティックの喪失)と同時に起こることが、取引がチャート化されるにつれてわかります。チャートが負の領域に急降下し、ラインが赤に変わってそのことを示します。リアルタイムバージョンの場合、取引は直線を形成し、市場ティックの喪失は見られません。
最も重要なことは、リアルタイムバージョンでもガベージコレクションが発生しているという事実です。しかし、このイベントはタイムクリティカルな取引コードに割り込みません。Java RTSによって、リアルタイムメソッドの処理時間が変動しないことが保証されます。
リアルタイムアプリケーションを比較的簡単に実現
このサンプルアプリケーションは、Javaでのリアルタイムアプリケーションの開発が比較的簡単なことを証明しています。事実、最小限のコードを修正するだけで、取引エンジンをリアルタイム対応にすることができました。
ただし、どのリアルタイムアプリケーションにも共通することですが、独自のリアルタイムJavaアプリケーションを設計するには、さらに多くの作業が必要です。重要なイベントが適切な優先順位で処理されるように設定しなければならないからです。とはいえ、Javaコードの書き方が大きく変わることはありません。リアルタイム動作の部分はJava RTSに任せておけばよいからです。