发送后记录传出的 FIX 消息

问题描述

我们通过apachecamel在我们的系统中使用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 
    }

那么有没有什么办法只在消息发送后才做一些日志呢?通过这种方式,我们将了解第一个日志和实际发送消息之间是否真的存在一些延迟以及发送所需的时间。

谢谢。

更新: 根据克里斯托夫的回答,尝试以下操作:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...