Fuse 6 is no longer supported
As of February 2025, Red Hat Fuse 6 is no longer supported. If you are using Fuse 6, please upgrade to Red Hat build of Apache Camel.第131章 QuickFix
QuickFix/J コンポーネント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.0 で利用可能
クイックフィックス コンポーネントは、Camel で を使用するために QuickFIX/J FIX エンジンを調整します。このコンポーネントは、メッセージトランスポートに標準の Financial Interchange (FIX)プロトコル を使用します。
以前のバージョン
クイックフィックス コンポーネントは Camel 2.5 用に書き換えられました。2.5 よりも前の クイックフィックス コンポーネントの使用方法は、以下のドキュメントを参照してください。
Maven ユーザーは、このコンポーネントの
pom.xml
に以下の依存関係を追加する必要があります。
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
quickfix:configFile[?sessionID=sessionID&lazyCreateEngine=true|false]
quickfix:configFile[?sessionID=sessionID&lazyCreateEngine=true|false]
configFile は、FIX エンジン(クラスパスにあるリソースとして配置)に使用する QuickFIX/J 設定の名前です。オプションの sessionID は、特定の FIX セッションを識別します。sessionID の形式は次のとおりです。
(BeginString):(SenderCompID)[/(SenderSubID)[/(SenderLocationID)]]->(TargetCompID)[/(TargetSubID)[/(TargetLocationID)]]
(BeginString):(SenderCompID)[/(SenderSubID)[/(SenderLocationID)]]->(TargetCompID)[/(TargetSubID)[/(TargetLocationID)]]
オプションの
lazyCreateEngine
(Camel 2.12.3+)パラメーターを使用すると、QuickFIX/J エンジンをオンデマンドで作成できます。値 true
は、最初のメッセージが送信されるか、ルート定義にコンシューマーが設定されている場合にエンジンが開始されることを意味します。false
の場合、エンジンはエンドポイントの作成時に開始されます。このパラメーターがない場合、コンポーネントのプロパティー lazyCreateEngines
の値が使用されます。
URI の例:
quickfix:config.cfg quickfix:config.cfg?sessionID=FIX.4.2:MyTradingCompany->SomeExchange quickfix:config.cfg?sessionID=FIX.4.2:MyTradingCompany->SomeExchange&lazyCreateEngine=true
quickfix:config.cfg
quickfix:config.cfg?sessionID=FIX.4.2:MyTradingCompany->SomeExchange
quickfix:config.cfg?sessionID=FIX.4.2:MyTradingCompany->SomeExchange&lazyCreateEngine=true
エンドポイント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
FIX セッションは、クイックフィックス コンポーネントのエンドポイントです。エンドポイント URI は、特定の QuickFIX/J エンジンによって管理される単一のセッションまたはすべてのセッションを指定できます。一般的なアプリケーションは FIX エンジンを 1 つだけ使用しますが、上級ユーザーは クイック修正 コンポーネントのエンドポイント URI で異なる設定ファイルを参照することで、複数の FIX エンジンを作成できます。
コンシューマーがエンドポイント URI にセッション ID が含まれていない場合、URI で指定された設定ファイルに関連付けられた FIX エンジンによって管理されるすべてのセッションに対するエクスチェンジを受信します。プロデューサーがエンドポイント URI でセッションを指定しない場合、送信される FIX メッセージにセッション関連のフィールドを含める必要があります。URI でセッションが指定されている場合、コンポーネントはセッション関連のフィールドを FIX メッセージに自動的に挿入します。
エクスチェンジの形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
エクスチェンジヘッダーには、エクスチェンジのフィルターリング、ルーティング、およびその他の処理に役立つ情報が含まれます。以下のヘッダーを使用できます。
ヘッダー名 | 説明 |
---|---|
EventCategory
|
AppMessageReceived 、AppMessageSent 、AdminMessageReceived 、AdminMessageSent 、SessionCreated 、SessionLogon 、SessionLogoff のいずれか。QuickfixjEventCategory enum を参照してください。
|
SessionID
|
FIX Message SessionID |
MessageType
|
FIX MsgType タグの値 |
DataDictionary
|
受信メッセージの解析に使用するデータディクショナリーを指定します。データディクショナリーのインスタンス、または QuickFIX/J データディクショナリーファイルのリソースパスを指定できます。 |
DataDictionary ヘッダーは、文字列メッセージが受信され、ルートで解析する必要がある場合に役立ちます。QuickFix/J では、(たとえば、グループを繰り返して)特定のタイプのメッセージを解析するためのデータディクショナリーが必要です。メッセージ文字列の受信後にルートに DataDictionary ヘッダーを挿入することで、FIX エンジンはデータを適切に解析できます。
QuickFix/J Configuration Extensions リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
QuickFIX/J を直接使用する場合、1 つは通常、ロギングアダプター、メッセージストア、および通信コネクターのインスタンスを作成するためのコードを書き込みます。クイックフィックス コンポーネントは、設定ファイルの情報に基づいてこれらのクラスのインスタンスを自動的に作成します。また、一般的な必要な設定の多くにデフォルトを提供し、追加機能を追加します(JMX サポートをアクティブにする機能など)。
以下のセクションでは、クイックフィックス コンポーネントが QuickFIX/J 設定を処理する方法を説明します。QuickFIX/J 設定に関する包括的な情報は、QFJ ユーザーマニュアル を参照してください。
通信コネクター リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
コンポーネントによって、QuickFIX/J 設定ファイルでイニシエーターまたはアクセプターセッション設定を検出すると、対応するイニシエーターやアクセプターコネクターが自動的に作成されます。これらの設定は、デフォルトの または 設定ファイルの特定の session セクションに指定できます。
セッションの設定 | コンポーネントの動作 |
---|---|
ConnectionType=initiator
|
イニシエーターコネクターの作成 |
ConnectionType=acceptor
|
アクセプターコネクターの作成 |
QuickFIX/J セッションコネクターのスレッドモデルを指定することもできます。これらの設定は設定ファイルのすべてのセッションに影響し、設定の default セクションに配置する必要があります。
デフォルト/グローバル設定 | コンポーネントの動作 |
---|---|
ThreadModel=ThreadPerConnector
|
SocketInitiator または SocketAcceptor (デフォルト)の使用
|
ThreadModel=ThreadPerSession
|
ThreadedSocketInitiator または ThreadedSocketAcceptor の使用
|
ロギング リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
QuickFIX/J ロガー実装を指定するには、設定ファイルの default セクションに以下の設定を追加します。設定に以下の設定がない場合は、
ScreenLog
がデフォルトになります。複数のログ実装を意味する設定を含めるのはエラーです。
デフォルト/グローバル設定 | コンポーネントの動作 |
---|---|
ScreenLogShowEvents
|
ScreenLog を使用する
|
ScreenLogShowIncoming
|
ScreenLog を使用する
|
ScreenLogShowOutgoing
|
ScreenLog を使用する
|
SLF4J*
|
Camel 2.6+SLF4JLog を使用します。SLF4J 設定のいずれかにより、このログが使用されます。
|
FileLogPath
|
FileLog を使用する
|
JdbcDriver
|
JdbcLog の使用
|
メッセージストア リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
QuickFIX/J メッセージストアの実装を指定するには、設定ファイルの default セクションに以下の設定を追加します。設定に以下の設定がない場合は、
MemoryStore
がデフォルトになります。複数のメッセージストアの実装を意味する設定を含めるのはエラーです。
デフォルト/グローバル設定 | コンポーネントの動作 |
---|---|
JdbcDriver
|
JdbcStore の使用
|
FileStorePath
|
FileStore の使用
|
SleepycatDatabaseDir
|
SleepcatStore の使用
|
メッセージファクトリー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
メッセージファクトリーは、未加工の FIX メッセージからドメインオブジェクトを構築するために使用されます。デフォルトのメッセージファクトリーは
DefaultMessageFactory
です。ただし、高度なアプリケーションではカスタムメッセージファクトリーが必要になる場合があります。これは、QuickFIX/J コンポーネントに設定できます。
JMX リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
デフォルト/グローバル設定 | コンポーネントの動作 |
---|---|
UseJmx
|
Y の場合は、QuickFIX/J JMX を有効にします。
|
その他のデフォルト リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
コンポーネントは、QuickFIX/J 設定ファイルで通常必要な設定についてデフォルト設定を提供します。
SessionStartTime
および SessionEndTime
はデフォルトで 00:00:00 で、セッションは自動的に開始および停止されません。HeartBtInt
(heartbeat 間隔)はデフォルトで 30 秒です。
最小限のイニシエーター設定の例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
[SESSION] ConnectionType=initiator BeginString=FIX.4.4 SenderCompID=YOUR_SENDER TargetCompID=YOUR_TARGET
[SESSION]
ConnectionType=initiator
BeginString=FIX.4.4
SenderCompID=YOUR_SENDER
TargetCompID=YOUR_TARGET
InOut メッセージ交換パターンの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.8+
FIX プロトコルはイベント駆動型で非同期ですが、リクエストリプライメッセージ交換を表す特定のメッセージのペアがあります。InOut 交換パターンを使用するには、リクエストメッセージと単一のリプライメッセージをリクエストに 1 つ設定する必要があります。例には、OrderStatusRequest メッセージおよび UserRequest が含まれます。
コンシューマーの InOut エクスチェンジの実装 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
QuickFIX/J enpoint URI にexchangePattern=InOut を追加します。以下の例の
MessageOrderStatusService
は、同期サービスメソッドを持つ Bean です。メソッドはリクエストへの応答を返します(この場合は ExecutionReport)。その後、要求元セッションに送信されます。
from("quickfix:examples/inprocess.cfg?sessionID=FIX.4.2:MARKET->TRADER&exchangePattern=InOut") .filter(header(QuickfixjEndpoint.MESSAGE_TYPE_KEY).isEqualTo(MsgType.ORDER_STATUS_REQUEST)) .bean(new MarketOrderStatusService());
from("quickfix:examples/inprocess.cfg?sessionID=FIX.4.2:MARKET->TRADER&exchangePattern=InOut")
.filter(header(QuickfixjEndpoint.MESSAGE_TYPE_KEY).isEqualTo(MsgType.ORDER_STATUS_REQUEST))
.bean(new MarketOrderStatusService());
プロデューサーの InOut エクスチェンジの実装 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
プロデューサーの場合、メッセージの送信は応答を受信するか、タイムアウトが発生するまでブロックされます。FIX でリプライメッセージを関連付ける標準的な方法はありません。そのため、InOut エクスチェンジのタイプごとに相関基準を定義する必要があります。相関基準とタイムアウトは、
Exchange
プロパティーを使用して指定できます。
説明 | キー文字列 | キー定数 | デフォルト | 相関基準 | "CorrelationCriteria" | QuickfixjProducer.CORRELATION_CRITERIA_KEY | なし | |
---|---|---|---|---|---|---|---|---|
相関タイムアウト(Milliseconds) | "CorrelationTimeout" | QuickfixjProducer.CORRELATION_TIMEOUT_KEY | 1000 |
相関基準は
MessagePredicate
オブジェクトで定義されます。以下の例では、トランザクションタイプが STATUS で、Order ID が要求に一致する指定のセッションの FIX ExecutionReport を処理します。セッション ID は 要求 側の、送信者とターゲットの CompID フィールドは、応答を検索する際に逆になります。
例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
ソースコードには、コンシューマーおよびプロデューサーの InOut エクスチェンジを示す
RequestReplyExample
という例が含まれています。この例では、注文ステータスリクエストを受け入れる単純な HTTP サーバーエンドポイントを作成します。HTTP リクエストは FIX OrderStatusRequestMessage に変換され、相関基準で拡張され、クイックフィックスエンドポイントにルーティングされます。その後、応答は JSON 形式の文字列に変換され、Web 応答として提供される HTTP サーバーエンドポイントに送信されます。
Spring 設定が Camel 2.9 以降に変更されました。以下に例を示します。
Spring の設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.6 - 2.8.x
QuickFIX/J コンポーネントには、Spring コンテキスト内でセッション設定を設定するための Spring
FactoryBean
が含まれています。QuickFIX/J セッション ID 文字列の型コンバーターも含まれています。以下の例は、両方のセッションのデフォルト設定を持つアクセプターおよびイニシエーターセッションの簡単な設定を示しています。
Camel 2.9 以降
QuickFIX/J コンポーネントには、セッション設定を設定するための
QuickfixjConfiguration
クラスが含まれています。QuickFIX/J セッション ID 文字列の型コンバーターも含まれています。以下の例は、両方のセッションのデフォルト設定を持つアクセプターおよびイニシエーターセッションの簡単な設定を示しています。
例外処理 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
メッセージの処理中に特定の例外が出力された場合、QuickFix/J の動作を変更できます。受信ログオン管理メッセージの処理中に
RejectLogon
例外が出力された場合、ログオンは拒否されます。
通常、QuickFIX/J はログオンプロセスを自動的に処理します。ただし、送信ログオンメッセージを変更して、FIX に必要な認証情報を含める必要がある場合があります。ログオンメッセージの送信時に FIX ログオンメッセージのボディーが変更された場合(EventCategory={{AdminMessageSent}})、変更されたメッセージは対応するメッセージに送信されます。送信ログオンメッセージが 同期的 に処理されることが重要です。非同期的に処理されている場合(別のスレッド上で)、FIX エンジンはコールバックメソッドが返されると、変更されていない送信メッセージを即座に送信します。
修正シーケンス番号管理 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
同期 エクスチェンジの処理中にアプリケーション例外が出力された場合、QuickFIX/J は受信 FIX メッセージシーケンス番号をインクリメントせず、対応するメッセージを再送信します。この FIX プロトコルの動作は、主にアプリケーションエラーではなく トランスポート エラーを処理することを目的としています。このメカニズムを使用してアプリケーションエラーを処理することに関連するリスクがあります。主なリスクは、メッセージが受信されるたびにアプリケーションエラーを繰り返し発生することです。より良い解決策は、処理の直前に受信メッセージ(データベース、JMS キュー)を保持することです。また、これにより、アプリケーションはエラーの発生時にメッセージを失うことなくメッセージを非同期に処理することもできます。
ログ先の FIX セッションにメッセージを送信することは可能ですが(メッセージはログオン時に送信されます)、通常はセッションがログに記録されるまで待つことが推奨されます。これにより、ログオンに必要なシーケンス番号の再同期手順がなくなります。セッションログオンを待つには、
SessionLogon
イベントカテゴリーを処理し、メッセージの送信を開始するようにアプリケーションに通知するルートを設定します。
FIX シーケンス番号管理の詳細については、FIX プロトコルの仕様と QuickFIX/J ドキュメントを参照してください。
ルートの例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
QuickFIX/J コンポーネントのソースコード(テストサブディレクトリー)にはいくつかの例が含まれています。これらの例の 1 つは、ミリュレートの超過シミュレーションを実装します。この例では、URI スキームの "trade-executor" を使用するアプリケーションコンポーネントを定義します。
以下のルートは、トレードオフエグゼキューターセッションのメッセージを受信し、アプリケーションメッセージを trade executor コンポーネントに渡します。
from("quickfix:examples/inprocess.cfg?sessionID=FIX.4.2:MARKET->TRADER"). filter(header(QuickfixjEndpoint.EVENT_CATEGORY_KEY).isEqualTo(QuickfixjEventCategory.AppMessageReceived)). to("trade-executor:market");
from("quickfix:examples/inprocess.cfg?sessionID=FIX.4.2:MARKET->TRADER").
filter(header(QuickfixjEndpoint.EVENT_CATEGORY_KEY).isEqualTo(QuickfixjEventCategory.AppMessageReceived)).
to("trade-executor:market");
トレードオフエクゼキューターコンポーネントは、トレードオフセッションにルーティングされるメッセージを生成します。エンドポイント URI にはセッション ID が指定されていないため、セッション ID は FIX メッセージ自体で設定する必要があります。
from("trade-executor:market").to("quickfix:examples/inprocess.cfg");
from("trade-executor:market").to("quickfix:examples/inprocess.cfg");
トレーターセッションは、市場から実行レポートメッセージを消費し、それらを処理します。
from("quickfix:examples/inprocess.cfg?sessionID=FIX.4.2:TRADER->MARKET"). filter(header(QuickfixjEndpoint.MESSAGE_TYPE_KEY).isEqualTo(MsgType.EXECUTION_REPORT)). bean(new MyTradeExecutionProcessor());
from("quickfix:examples/inprocess.cfg?sessionID=FIX.4.2:TRADER->MARKET").
filter(header(QuickfixjEndpoint.MESSAGE_TYPE_KEY).isEqualTo(MsgType.EXECUTION_REPORT)).
bean(new MyTradeExecutionProcessor());
QuickFix/J Component Prior to Camel 2.5 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.0 以降で利用可能
クイックフィックス コンポーネントは、Java 用の QuickFIX/J エンジンの実装です。このエンジンでは、FIX プロトコル標準に従って銀行メッセージを交換するために使用される FIX サーバーに接続できます。
注記: コンポーネントを使用して、FIX サーバーにメッセージを送受信できます。
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
quickfix-server:config file quickfix-client:config file
quickfix-server:config file
quickfix-client:config file
設定ファイル は、起動時にエンジンを設定するために使用されるクイックフィックス設定ファイルの場所(クラスパス内)です。
注記: クイック修正に使用できるパラメーターに関する情報は、QuickFIX/J Web サイトを参照してください。
FIX ゲートウェイにメッセージを送信する場合は、fixed server FIX メッセージと quickfix-client エンドポイントから受信するために quickfix-server エンドポイントを使用する必要があります。
エクスチェンジデータ形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
QuickFIX/J エンジンは、MINA をプロトコルレイヤーとして使用し、FIX エンジンゲートウェイでソケット接続を作成する CXF コンポーネントと似ています。
QuickFIX/J エンジンがメッセージを受信すると、camel エンドポイントによって次に受信される QuickFix.Message インスタンスを作成します。このオブジェクトは、最初にキー/値のペアデータのコレクションとしてフォーマットされた FIX メッセージから作成されるマッピングオブジェクトです。このオブジェクトを使用するか、またはメソッド toString を使用して元の FIX メッセージを取得できます。
注記: または、camel bindy dataformat を使用して FIX メッセージを独自の Java POJO に変換することもできます。
メッセージを QuickFix に送信する必要がある場合は、
QuickFix.Message
インスタンスを作成する必要があります。
Lazy creating engines リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.12.3 以降では、QuickFix コンポーネントをレイジーにエンジンを作成および起動するように設定できます。その後、これらのオンマンドのみを起動します。たとえば、マスター/スレーブのクラスターに複数の Camel アプリケーションがある場合に使用できます。また、スレーブをスタンバイ状態にします。
サンプル リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
方向 : FIX ゲートウェイ
<route> <from uri="activemq:queue:fix"/> <bean ref="fixService" method="createFixMessage" /> // bean method in charge to transform message into a QuickFix.Message <to uri="quickfix-client:META-INF/quickfix/client.cfg" /> // Quickfix engine who will send the FIX messages to the gateway </route>
<route>
<from uri="activemq:queue:fix"/>
<bean ref="fixService" method="createFixMessage" /> // bean method in charge to transform message into a QuickFix.Message
<to uri="quickfix-client:META-INF/quickfix/client.cfg" /> // Quickfix engine who will send the FIX messages to the gateway
</route>
方向:FIX ゲートウェイから
<route> <from uri="quickfix-server:META-INF/quickfix/server.cfg"/> // QuickFix engine who will receive the message from FIX gateway <bean ref="fixService" method="parseFixMessage" /> // bean method parsing the QuickFix.Message <to uri="uri="activemq:queue:fix"/>" /> </route>
<route>
<from uri="quickfix-server:META-INF/quickfix/server.cfg"/> // QuickFix engine who will receive the message from FIX gateway
<bean ref="fixService" method="parseFixMessage" /> // bean method parsing the QuickFix.Message
<to uri="uri="activemq:queue:fix"/>" />
</route>