第131章 QuickFix


QuickFix/J コンポーネント

Camel 2.0 で利用可能
クイックフィックス コンポーネントは、Camel で を使用するために QuickFIX/J FIX エンジンを調整します。このコンポーネントは、メッセージトランスポートに標準の Financial Interchange (FIX)プロトコル を使用します。
以前のバージョン
クイックフィックス コンポーネントは Camel 2.5 用に書き換えられました。2.5 よりも前の クイックフィックス コンポーネントの使用方法は、以下のドキュメントを参照してください。
Maven ユーザーは、このコンポーネントの pom.xml に以下の依存関係を追加する必要があります。
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-quickfix</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
Copy to Clipboard Toggle word wrap

URI 形式

quickfix:configFile[?sessionID=sessionID&lazyCreateEngine=true|false]
Copy to Clipboard Toggle word wrap
configFile は、FIX エンジン(クラスパスにあるリソースとして配置)に使用する QuickFIX/J 設定の名前です。オプションの sessionID は、特定の FIX セッションを識別します。sessionID の形式は次のとおりです。
(BeginString):(SenderCompID)[/(SenderSubID)[/(SenderLocationID)]]->(TargetCompID)[/(TargetSubID)[/(TargetLocationID)]]
Copy to Clipboard Toggle word wrap
オプションの 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
Copy to Clipboard Toggle word wrap

エンドポイント

FIX セッションは、クイックフィックス コンポーネントのエンドポイントです。エンドポイント URI は、特定の QuickFIX/J エンジンによって管理される単一のセッションまたはすべてのセッションを指定できます。一般的なアプリケーションは FIX エンジンを 1 つだけ使用しますが、上級ユーザーは クイック修正 コンポーネントのエンドポイント URI で異なる設定ファイルを参照することで、複数の FIX エンジンを作成できます。
コンシューマーがエンドポイント URI にセッション ID が含まれていない場合、URI で指定された設定ファイルに関連付けられた FIX エンジンによって管理されるすべてのセッションに対するエクスチェンジを受信します。プロデューサーがエンドポイント URI でセッションを指定しない場合、送信される FIX メッセージにセッション関連のフィールドを含める必要があります。URI でセッションが指定されている場合、コンポーネントはセッション関連のフィールドを FIX メッセージに自動的に挿入します。

エクスチェンジの形式

エクスチェンジヘッダーには、エクスチェンジのフィルターリング、ルーティング、およびその他の処理に役立つ情報が含まれます。以下のヘッダーを使用できます。
Expand
ヘッダー名 説明
EventCategory AppMessageReceivedAppMessageSentAdminMessageReceivedAdminMessageSentSessionCreatedSessionLogonSessionLogoff のいずれか。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 セクションに指定できます。
Expand
セッションの設定 コンポーネントの動作
ConnectionType=initiator イニシエーターコネクターの作成
ConnectionType=acceptor アクセプターコネクターの作成
QuickFIX/J セッションコネクターのスレッドモデルを指定することもできます。これらの設定は設定ファイルのすべてのセッションに影響し、設定の default セクションに配置する必要があります。
Expand
デフォルト/グローバル設定 コンポーネントの動作
ThreadModel=ThreadPerConnector SocketInitiator または SocketAcceptor (デフォルト)の使用
ThreadModel=ThreadPerSession ThreadedSocketInitiator または ThreadedSocketAcceptorの使用

ロギング

QuickFIX/J ロガー実装を指定するには、設定ファイルの default セクションに以下の設定を追加します。設定に以下の設定がない場合は、ScreenLog がデフォルトになります。複数のログ実装を意味する設定を含めるのはエラーです。
Expand
デフォルト/グローバル設定 コンポーネントの動作
ScreenLogShowEvents ScreenLogを使用する
ScreenLogShowIncoming ScreenLogを使用する
ScreenLogShowOutgoing ScreenLogを使用する
SLF4J* Camel 2.6+SLF4JLog を使用します。SLF4J 設定のいずれかにより、このログが使用されます。
FileLogPath FileLogを使用する
JdbcDriver JdbcLogの使用

メッセージストア

QuickFIX/J メッセージストアの実装を指定するには、設定ファイルの default セクションに以下の設定を追加します。設定に以下の設定がない場合は、MemoryStore がデフォルトになります。複数のメッセージストアの実装を意味する設定を含めるのはエラーです。
Expand
デフォルト/グローバル設定 コンポーネントの動作
JdbcDriver JdbcStoreの使用
FileStorePath FileStoreの使用
SleepycatDatabaseDir SleepcatStoreの使用

メッセージファクトリー

メッセージファクトリーは、未加工の FIX メッセージからドメインオブジェクトを構築するために使用されます。デフォルトのメッセージファクトリーは DefaultMessageFactory です。ただし、高度なアプリケーションではカスタムメッセージファクトリーが必要になる場合があります。これは、QuickFIX/J コンポーネントに設定できます。

JMX

Expand
デフォルト/グローバル設定 コンポーネントの動作
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
Copy to Clipboard Toggle word wrap

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());

Copy to Clipboard Toggle word wrap

プロデューサーの InOut エクスチェンジの実装

プロデューサーの場合、メッセージの送信は応答を受信するか、タイムアウトが発生するまでブロックされます。FIX でリプライメッセージを関連付ける標準的な方法はありません。そのため、InOut エクスチェンジのタイプごとに相関基準を定義する必要があります。相関基準とタイムアウトは、Exchange プロパティーを使用して指定できます。
Expand
説明 キー文字列 キー定数 デフォルト 相関基準 "CorrelationCriteria" QuickfixjProducer.CORRELATION_CRITERIA_KEY なし
相関タイムアウト(Milliseconds) "CorrelationTimeout" QuickfixjProducer.CORRELATION_TIMEOUT_KEY 1000
相関基準は MessagePredicate オブジェクトで定義されます。以下の例では、トランザクションタイプが STATUS で、Order ID が要求に一致する指定のセッションの FIX ExecutionReport を処理します。セッション ID は 要求 側の、送信者とターゲットの CompID フィールドは、応答を検索する際に逆になります。
 exchange.setProperty(QuickfixjProducer.CORRELATION_CRITERIA_KEY, 
     new MessagePredicate(new SessionID(sessionID), MsgType.EXECUTION_REPORT)
         .withField(ExecTransType.FIELD, Integer.toString(ExecTransType.STATUS))
         .withField(OrderID.FIELD, request.getString(OrderID.FIELD)));

Copy to Clipboard Toggle word wrap

ソースコードには、コンシューマーおよびプロデューサーの 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 route -->
      <camelContext id="quickfixjContext" xmlns="http://camel.apache.org/schema/spring">
      <route>
      <from uri="quickfix:example"/>
      <filter>
      <simple>${in.header.EventCategory} == 'AppMessageReceived'</simple>
      <to uri="log:test"/>
      </filter>
      </route>
      </camelContext>
      
      <!-- quickfix component -->
      <bean id="quickfix" class="org.apache.camel.component.quickfixj.QuickfixjComponent">
      <property name="engineSettings">
      <util:map>
      <entry key="quickfix:example" value-ref="quickfixjSettings"/>
      </util:map>
      </property>
      <property name="messageFactory">
      <bean class="org.apache.camel.component.quickfixj.QuickfixjSpringTest.CustomMessageFactory"/>
      </property>
      </bean>
      
      <!-- quickfix settings -->
      <bean id="quickfixjSettings"
      class="org.apache.camel.component.quickfixj.QuickfixjSettingsFactory">
      <property name="defaultSettings">
      <util:map>
      <entry key="SocketConnectProtocol" value="VM_PIPE"/>
      <entry key="SocketAcceptProtocol" value="VM_PIPE"/>
      <entry key="UseDataDictionary" value="N"/>
      </util:map>
      </property>
      <property name="sessionSettings">
      <util:map>
      <entry key="FIX.4.2:INITIATOR->ACCEPTOR">
      <util:map>
      <entry key="ConnectionType" value="initiator"/>
      <entry key="SocketConnectHost" value="localhost"/>
      <entry key="SocketConnectPort" value="5000"/>
      </util:map>
      </entry>
      <entry key="FIX.4.2:ACCEPTOR->INITIATOR">
      <util:map>
      <entry key="ConnectionType" value="acceptor"/>
      <entry key="SocketAcceptPort" value="5000"/>
      </util:map>
      </entry>
      </util:map>
      </property>
      </bean>
Copy to Clipboard Toggle word wrap
Camel 2.9 以降
QuickFIX/J コンポーネントには、セッション設定を設定するための QuickfixjConfiguration クラスが含まれています。QuickFIX/J セッション ID 文字列の型コンバーターも含まれています。以下の例は、両方のセッションのデフォルト設定を持つアクセプターおよびイニシエーターセッションの簡単な設定を示しています。
<!-- camel route -->
<camelContext id="quickfixjContext" xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="quickfix:example"/>
        <filter>
            <simple>${in.header.EventCategory} == 'AppMessageReceived'</simple>
            <to uri="log:test"/>
        </filter>
    </route>
</camelContext>

<!-- quickfix component -->
<bean id="quickfix" class="org.apache.camel.component.quickfixj.QuickfixjComponent">
    <property name="configurations">
        <util:map>
            <entry key="example" value-ref="quickfixjConfiguration"/>
        </util:map>
    </property>
    <property name="messageFactory">
        <bean class="org.apache.camel.component.quickfixj.QuickfixjSpringTest.CustomMessageFactory"/>
    </property>
</bean>

<!-- quickfix settings -->
<bean id="quickfixjConfiguration" class="org.apache.camel.component.quickfixj.QuickfixjConfiguration">
    <property name="defaultSettings">
        <util:map>
            <entry key="SocketConnectProtocol" value="VM_PIPE"/>
            <entry key="SocketAcceptProtocol" value="VM_PIPE"/>
            <entry key="UseDataDictionary" value="N"/>
        </util:map>
    </property>
    <property name="sessionSettings">
        <util:map>
            <entry key="FIX.4.2:INITIATOR->ACCEPTOR">
                <util:map>
                    <entry key="ConnectionType" value="initiator"/>
                    <entry key="SocketConnectHost" value="localhost"/>
                    <entry key="SocketConnectPort" value="5000"/>
                </util:map>
            </entry>
            <entry key="FIX.4.2:ACCEPTOR->INITIATOR">
                <util:map>
                    <entry key="ConnectionType" value="acceptor"/>
                    <entry key="SocketAcceptPort" value="5000"/>
                </util:map>
            </entry>
        </util:map>
    </property>
</bean>
Copy to Clipboard Toggle word wrap

例外処理

メッセージの処理中に特定の例外が出力された場合、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");
Copy to Clipboard Toggle word wrap
トレードオフエクゼキューターコンポーネントは、トレードオフセッションにルーティングされるメッセージを生成します。エンドポイント URI にはセッション ID が指定されていないため、セッション ID は FIX メッセージ自体で設定する必要があります。
from("trade-executor:market").to("quickfix:examples/inprocess.cfg");
Copy to Clipboard Toggle word wrap
トレーターセッションは、市場から実行レポートメッセージを消費し、それらを処理します。
from("quickfix:examples/inprocess.cfg?sessionID=FIX.4.2:TRADER->MARKET").
    filter(header(QuickfixjEndpoint.MESSAGE_TYPE_KEY).isEqualTo(MsgType.EXECUTION_REPORT)).
    bean(new MyTradeExecutionProcessor());
Copy to Clipboard Toggle word wrap

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
Copy to Clipboard Toggle word wrap
設定ファイル は、起動時にエンジンを設定するために使用されるクイックフィックス設定ファイルの場所(クラスパス内)です。
注記: クイック修正に使用できるパラメーターに関する情報は、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>
Copy to Clipboard Toggle word wrap
方向: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>
Copy to Clipboard Toggle word wrap
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat