我在我的java应用程序中使用quickfixj来处理修复会话。 通常,每个传入消息最初都会记录在某个线程中,例如 [NioProcessor-12],据我了解,这是一些 IO 线程,然后出现在 [QF/J Session Dispatcher] 线程中,该线程在侦听器中调用我的应用程序代码。
我最近遇到一个情况,我的调度程序代码在处理传入的修复消息时速度很慢,并且在调查过程中我看到很多消息是由 Quickfix 在 NioProcessor 线程中记录的,但没有出现在 Session Dispatcher 线程中。
如果调度程序速度很慢,是否有任何缓冲区/等可能会溢出,从而导致消息以某种方式丢失?
谢谢。
您的
MessageDispatchingThread
可以通过两种方式进行配置。
可以使用普通队列(默认容量 10000,您可以传递其他大小),也可以使用基于水印的队列(您可以传入您想要的高/低水印)。
由于默认队列是
LinkedBlockingQueue
,因此当没有可用空间时它将阻塞。从长远来看,当您的应用程序无法及时处理心跳消息时,这将导致连接断开。
水印队列将在达到高水印时通过暂停套接字读取来限制传入消息,并在达到低水印时恢复读取消息。当您的应用程序持续缓慢时,当套接字缓冲区溢出或您没有及时处理心跳时,它也会中断连接。