我想澄清在以下情況下QuickFIX/J
(FIX 4.2)的行爲。有兩方參與這一QuickFIX/J
通信:QuickFIX/J中斷開連接的客戶端的消息隊列行爲
- 客戶端發起,名爲我。
- 我們公司的接受者計劃,名爲A。
當我登錄到一個,他們交換FIX信息與標籤35=A
。連接建立後,I開始提交訂單。有可能是一個點然而,在我意外斷開,此時一個決定發送所有的的未結訂單的取消我(這是有效的,因爲一個不知道爲什麼我失敗或當我會回來活着)。
注意,這整個取消上斷開程序啓動和處理由一個孤獨的 - 它從一個的onLogout(...)
方法發起並由其正常秩序的管理機制處理。對於每個開放訂單I生成單個35=F
消息,並且在每次成功取消時生成ExecutionReport
(35=8
)。
當我回來活着,這些ExecutionReport
s必須交付給我不知何故,使其意識到了所有以前的訂單已被取消。我有一個印象,QuickFIX/J
的消息隊列實現處理這個沒有應用程序級的援助。確保所有QuickFIX
消息傳遞給對方(http://permalink.gmane.org/gmane.comp.finance.quickfix.devel/169)。
出乎我的理解,但是,沒有ExecutionReport
小號沒有在一個的QuickFIX
日誌顯示的,或交付我在重新連接我,導致我是不知道它以前的訂單有已被取消。我注意到,記錄不會的,因爲在QuickFIX/J
的Session
的sendRaw(Message message, int num)
方法的下面的源代碼中出現:
/**
* 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"
}
}
...
}
而消除由我的啓動產生ExecutionReport
消息被該會議沒有登錄斷開連接,因此它從未打到send(messageString);
並且沒有記錄發生。我相信沒有消息排隊(基於事實我回收活動時沒有收到任何消息)出於同樣的原因。
我們公司基於相信QuickFIX/J
保證所有消息都能毫無損失地交付,但我對上述場景的觀察卻另有說明。
當會話沒有登錄時,QuickFIX/J
的消息隊列是如何運行的?它應該排隊消息嗎,等待將來會話再次可用時發送,還是在會話關閉期間停止排隊?
如果沒有人回答這個問題,你可以試試QF/j郵件列表。 –
「但是,如果我意外斷開連接,那麼A會決定取消所有I [...]的所有未結訂單的取消」。聽起來很糟糕。只是因爲有15分鐘的網絡問題,您取消所有訂單?很抱歉這麼說,但這聽起來很荒謬。這背後有什麼理由?那個要求有什麼真正的商業解釋? –
@GrantBirchmeier感謝您的反饋。我們實際上證實了'35 = 8'和'150 = 4'在重新連接時從接受者來到發起者。我無法檢測到這一點。 – ylee