QuickFIX/J
以下のシナリオでの (FIX 4.2) の動作を明確にしたかったのです。このQuickFIX/J
通信には、次の 2 つの関係者が関係しています。
- Iと呼ばれるクライアント イニシエーター。
- Aと呼ばれる当社のアクセプタープログラム。
Aにログオンすると、彼らは FIX メッセージを tag と交換します。接続が確立されると、注文の送信を開始します。しかし、私が予期せず接続を切断し、その時点でAがIのすべてのオープン注文に対してキャンセルを送信することを決定する可能性があります(これは有効です。なぜなら、Aは私が失敗した理由や、いつ生き返るかを知らないからです) 。35=A
この切断時のキャンセル手順全体は、Aのみによって開始および処理されることに注意してください。これは、 AのonLogout(...)
メソッドから開始され、通常の注文管理メカニズムによって処理されます。I35=F
のオープン注文ごとに1 つのメッセージが生成され、キャンセルが成功するたびに( ) が生成されます。ExecutionReport
35=8
私が生きて戻ってきたとき、以前の注文がすべてキャンセルされたことを認識できるように、これらのs を何らかの方法で私ExecutionReport
に届ける必要があります。のメッセージ キューの実装は、アプリケーション レベルの支援なしでこれを処理するという印象を受けました。すべてのメッセージは、相手方 ( http://permalink.gmane.org/gmane.comp.finance.quickfix.devel/169 )に確実に配信されます。QuickFIX/J
QuickFIX
しかし、私の理解に反して、AのログにExecutionReport
s が表示されなかったり、再接続したときにsが配信されなかったりしたため、以前の注文がキャンセルされたことに気づきませんでした。inのメソッドの次のソース コードが原因で、ログが記録されないことに気付きました。QuickFIX
sendRaw(Message message, int num)
Session
QuickFIX/J
/**
* Send the message
*
* @param message is the message to send
* @param num is the seq num of the message to send, if 0, the next expected sender seqnum is used.
* @return
*/
private boolean sendRaw(Message message, int num) {
...
} else {
try {
application.toApp(message, sessionID);
} catch (final DoNotSend e) {
return false;
} catch (final Throwable t) {
logApplicationException("toApp()", t);
}
messageString = message.toString();
if (isLoggedOn()) { // happens only if session is connected
result = send(messageString); // logging happens within "send"
}
}
...
}
Iの切断ExecutionReport
によって開始されたキャンセルのメッセージが生成されている間、セッションはログオンしていませんでした。同じ理由で、メッセージがキューに入れられなかったと思います(生き返ったときにメッセージを受信しないという事実に基づいています)。send(messageString);
QuickFIX/J
私たちの会社は、すべてのメッセージが損失なく配信されることを保証するという信念に基づいて多くの実装を行いましたが、上記のシナリオに関する私の観察はそうではありません。
QuickFIX/J
セッションがログオンしていない場合、このシナリオで のメッセージ キューはどのように動作すると予想されますか? 関係なくメッセージをキューに入れ、セッションが将来再び利用可能になったときに送信されるのを待つべきですか、それともセッションがダウンしている間キューイングを停止するべきですか?