我正在使用QuickFIX / J来实现一个跟踪TradeCaptureReport
消息的非常简单的应用程序。基本上,应用程序仅将通过public void fromApp(Message message, SessionID session)
收到的所有消息存储到数据库中。
假设由于某种原因数据库暂时关闭。解决这种情况的最佳方法是什么?
只需从RuntimeException
投出public void fromApp(Message message, SessionID session)
即可。这将阻止消息从队列中删除,并且将使用此消息一次又一次地调用fromApp
,直到数据库再次启动。到达我的FIX引擎的其他消息将在我们的末尾堆积。
一旦我们检测到数据库连接问题,我们就会从fromApp
注销并抛出RuntimeException。这样可以确保不会从队列中删除最后一条消息,并且会在FIX会话的另一侧(对方)堆积任何其他消息。我们继续轮询数据库,直到它再次出现。再一次,我们登录并继续我们离开的地方。
还有其他选择吗?
答案 0 :(得分:1)
您的第二个选项有点可以:当您检测到数据库/ OMS出现故障时注销。但是,当您刚收到TradeCaptureReport
时,您可能只会注意到这一点。
选项:
使用拒绝原因BusinessMessageReject
回复BusinessRejectReason.APPLICATION_NOT_AVAILABLE
。将RefSeqNum
设置为您收到的邮件的MsgSeqNum
,可以选择在Text (58)
中设置原因。请注意,这取决于交易对手的实施,是否可以正确处理,甚至支持。
提供永远不会 down 的备用邮件存储。例如,您自己维护的磁盘上的存储,您知道它永远不会停止。数据库/ OMS再次启动后,将存储转发到您的数据库/ OMS。 AFAICT这是处理此问题的最有力方法。