发送后记录传出的 FIX 消息
Log outgoing FIX message after sending
我们通过 apache camel 在我们的系统中使用 quickfixj:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-quickfix</artifactId>
<version>${camel.version}</version>
</dependency>
我们现在正在尝试解决我们的 FIX 通道的问题,并想了解消息通信的延迟在哪里 – 在我们的网络中发送消息时还是在银行端。
quickfixj 有一个传出消息日志记录,但问题是日志记录已完成 before
发送消息,然后异步发送消息本身
private boolean send(String messageString) {
getLog().onOutgoing(messageString); // message is logged here
...
return responder.send(messageString); // async sent inside
}
那么有什么办法可以在消息发送后才做一些日志吗?这样我们就可以了解第一个日志和实际发送消息之间是否真的有一些延迟,以及发送需要多长时间。
谢谢。
更新:
根据 Christoph 的回答,尝试以下操作:
val engine = (camelContext.getEndpoint(fixConfiguration.fixEndpoint) as QuickfixjEndpoint).engine
engine::class.java.getDeclaredField("acceptor").let {
it.isAccessible = true
val acceptor = it.get(engine) as SessionConnector
val loggingFilter = LoggingFilter()
loggingFilter.sessionOpenedLogLevel = LogLevel.NONE // don't log this event
loggingFilter.sessionCreatedLogLevel = LogLevel.NONE // don't log this event
acceptor.setIoFilterChainBuilder { chain -> chain.addLast("LoggingFilter", loggingFilter) }
}
我进行了一些测试,认为可行的方法是使用 org.apache.mina.filter.logging.LoggingFilter
。
我假设您使用的是 Initiator
,但它当然也适用于 Acceptor
。
LoggingFilter loggingFilter = new LoggingFilter();
loggingFilter.setSessionOpenedLogLevel(LogLevel.NONE); // don't log this event
loggingFilter.setSessionCreatedLogLevel(LogLevel.NONE); // don't log this event
initiator.setIoFilterChainBuilder(chain -> chain.addLast("LoggingFilter", loggingFilter));
这将在您的日志中创建如下事件:
Feb 13, 2021 1:05:11 AM org.apache.mina.filter.logging.LoggingFilter log
INFO: SENT: 8=FIX.4.29=6735=A34=149=TW52=20210213-00:05:11.18456=ISLD98=0108=30141=Y10=244
...
Feb 13, 2021 1:05:11 AM org.apache.mina.filter.logging.LoggingFilter log
INFO: RECEIVED: 8=FIX.4.29=6735=A34=149=ISLD52=20210213-00:05:11.22456=TW98=0108=30141=Y10=239
我们通过 apache camel 在我们的系统中使用 quickfixj:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-quickfix</artifactId>
<version>${camel.version}</version>
</dependency>
我们现在正在尝试解决我们的 FIX 通道的问题,并想了解消息通信的延迟在哪里 – 在我们的网络中发送消息时还是在银行端。
quickfixj 有一个传出消息日志记录,但问题是日志记录已完成 before
发送消息,然后异步发送消息本身
private boolean send(String messageString) {
getLog().onOutgoing(messageString); // message is logged here
...
return responder.send(messageString); // async sent inside
}
那么有什么办法可以在消息发送后才做一些日志吗?这样我们就可以了解第一个日志和实际发送消息之间是否真的有一些延迟,以及发送需要多长时间。
谢谢。
更新: 根据 Christoph 的回答,尝试以下操作:
val engine = (camelContext.getEndpoint(fixConfiguration.fixEndpoint) as QuickfixjEndpoint).engine
engine::class.java.getDeclaredField("acceptor").let {
it.isAccessible = true
val acceptor = it.get(engine) as SessionConnector
val loggingFilter = LoggingFilter()
loggingFilter.sessionOpenedLogLevel = LogLevel.NONE // don't log this event
loggingFilter.sessionCreatedLogLevel = LogLevel.NONE // don't log this event
acceptor.setIoFilterChainBuilder { chain -> chain.addLast("LoggingFilter", loggingFilter) }
}
我进行了一些测试,认为可行的方法是使用 org.apache.mina.filter.logging.LoggingFilter
。
我假设您使用的是 Initiator
,但它当然也适用于 Acceptor
。
LoggingFilter loggingFilter = new LoggingFilter();
loggingFilter.setSessionOpenedLogLevel(LogLevel.NONE); // don't log this event
loggingFilter.setSessionCreatedLogLevel(LogLevel.NONE); // don't log this event
initiator.setIoFilterChainBuilder(chain -> chain.addLast("LoggingFilter", loggingFilter));
这将在您的日志中创建如下事件:
Feb 13, 2021 1:05:11 AM org.apache.mina.filter.logging.LoggingFilter log
INFO: SENT: 8=FIX.4.29=6735=A34=149=TW52=20210213-00:05:11.18456=ISLD98=0108=30141=Y10=244
...
Feb 13, 2021 1:05:11 AM org.apache.mina.filter.logging.LoggingFilter log
INFO: RECEIVED: 8=FIX.4.29=6735=A34=149=ISLD52=20210213-00:05:11.22456=TW98=0108=30141=Y10=239