При обработке отчета о выполнении вы не должны исключать какие-либо исключения и ожидать, что библиотека FIX обработает его. Вы либо обрабатываете отчет, либо имеете системный сбой (т. Е. Вызываете abort()
). Поэтому, если ваш код, обрабатывающий отчет о выполнении, генерирует исключение, и вы знаете, как его обрабатывать, затем поймайте его в той же самой функции, устраните причину проблемы и повторите попытку. Например (псевдо-код):
// This function is called by FIX library. No exceptions must be thrown because
// FIX library has no idea what to do with them.
void on_exec_report(const fix::msg &msg)
{
for (;;) {
try {
// Handle the execution report however you want.
handle_exec_report(msg);
} catch(const try_again_exception &) {
// Oh, some resource was temporarily unavailable? Try again!
continue;
} catch(const std::exception &) {
// This should never happen, but it did. Call 911.
abort();
}
}
}
Конечно, это можно сделать библиотеку FIX сделать запрос на повторную передачу и передать вам это сообщение еще раз, если было сгенерировано исключение. Тем не менее, это не имеет никакого смысла, потому что, чтобы попросить отправителя (по сети, используя TCP/IP) повторно отправить сообщение, которое у вас уже есть (вверх по вашему стеку :)), и просто нужно обработать. Даже если бы это произошло, какова гарантия, что это не повторится? Повторная передача в этом случае не только не звучит правильно логически, другая сторона (т.е. обмен) может вызвать вас и попросить прекратить делать это дерьмо, потому что вы слишком много загружаете на свой сервер с ненужной повторной передачей (потому что IRL TCP/IP не теряет сообщений, и процесс синхронизации последовательности FIX происходит только при подключении, если, конечно, не используется некоторая ненадежная транспортировка, что теоретически возможно, но не происходит на практике).
При прерывании, тем не менее, библиотека библиотеки FIX не должна увеличивать последовательность RX, если она точно не знает, что пользователь обработал это сообщение. Так, что в следующий раз приложение запускается, оно фактически выполняет синхронизацию и получает отсутствующие сообщения. Если QuickFIX этого не делает, вам нужно либо исправить это, либо позаботиться об этом вручную (например, открыть винт с файлом, где хранятся порядковые номера RX/TX), либо использовать какую-либо другую библиотеку, которая правильно ее обрабатывает.