在处理 FIX 传入消息时处理 QuickFix/J 中的错误的选项

Options for dealing with errors in QuickFix/J while processing FIX incoming messages

我正在使用 QuickFIX/J 实现一个非常简单的应用程序来跟踪 TradeCaptureReport 消息。基本上,该应用程序仅将通过 public void fromApp(Message message, SessionID session) 收到的所有消息存储到数据库中。

假设由于某种原因数据库暂时关闭。解决这种情况的最佳方法是什么?

  1. 只需从public void fromApp(Message message, SessionID session)中抛出一个RuntimeException。这将防止消息从队列中删除,并且 fromApp 将使用此消息一次又一次地被调用,直到数据库再次启动。到达我的 FIX 引擎的其他消息将堆积在我们这边。

  2. 一旦我们检测到数据库连接问题,我们就会注销并从 fromApp 中抛出 RuntimeException。这确保最后一条消息不会从队列中删除,并且任何进一步的消息都将堆积在 FIX 会话的另一端(在交易对手处)。我们继续轮询数据库,直到它再次出现。再次启动,我们登录并从我们离开的地方继续。

还有其他选择吗?

您的第二个选项还可以:当您检测到 database/OMS 出现故障时注销。但是,您可能只有在收到 TradeCaptureReport.

时才会注意到这一点

选项:

  1. 回复 BusinessMessageReject,拒绝原因 BusinessRejectReason.APPLICATION_NOT_AVAILABLE。将 RefSeqNum 设置为您收到的消息的 MsgSeqNum,可选择在 Text (58) 中设置原因。请注意,这是否会被正确处理,甚至是否得到支持,取决于交易对手的实施。

  2. 提供一个永远不会 down 的替代消息存储。例如,您自己维护的磁盘存储,并且您知道它永远不会崩溃。一旦 database/OMS 再次启动,将商店转发给您的 database/OMS。 AFAICT 这是处理此问题的最可靠方法。