调用quickfixj的fromApp回调时,外部场地消息多数字段缺失
我们使用QuickFixJ 2.3.1时遇到外部场地发送的消息被截断的问题,具体表现如下:
日志文件中的完整传入FIX消息
8=FIX.4.4 9=639 35=R 34=3 49=GLMX 52=20250619-14:15:59.494 56=BANK 60=20250619-14:15:59.418 131=GLMXI2375743V1 146=1 55=[N/A] 711=1 311=[N/A] 309=98421MAB2 305=1 246=1.0000000000 462=13 310=REPO 763=Specific 307=XRX 5.5 08/15/28 144A 318=USD 879=29900000.00000000 810=73.24990000 5005=75.12500000 54=1 15=USD 423=9 5020=0 788=2 898=0.00000000 5002=0 916=20250619 917=20250620 919=0 921=22462375.00000000 5003=2 221=NONE 5022=GLMXI2375743 5023=N 5044=0 78=1 79=FUND1 80=29900000.00000000 453=5 448=MLI 447=D 452=1 448=BANK Customer 447=D 452=3 448=chris.milburn+customer@bank.com 447=D 452=37 448=DTCC 447=D 452=10 448=GLMX 447=D 452=22 303=2 537=1 5038=Y 10=152
fromApp回调中收到的截断消息
INFO com.baml.gffrepoet.quickfixj.application.ClientApplicationAdapter: fromApp: Message=8=FIX.4.4 9=101 35=R 34=3 49=GLMX 52=20250619-14:15:59.494 56=BANK 60=20250619-14:15:59.418 131=GLMXI2375743V1 146=1 10=187
当前配置信息
[default] FileStorePath=logs/GLMXRFQ-DEV/ ConnectionType=initiator SenderCompID=BANK StartTime=00:00:00 EndTime=00:00:00 HeartBtInt=30 ReconnectInterval=5 FileLogPath=logs ResetOnLogon=Y [session] BeginString=FIX.4.4 DefaultApplVerID= TargetCompID=GLMX SocketConnectPort=4111 UseDataDictionary=Y DataDictionary=FIX44.xml SocketConnectHost=199.43.71.118 ValidateFieldsOutOfOrder=N ValidateFieldsHaveValues=N ValidateUserDefinedFields=N ValidateUnorderedGroupFields=N ValidateIncomingMessage=N DefaultApplVerID=FIX.4.4 SocketUseSSL=Y SocketTrustStore=/app_data/security/cacerts.truststore SocketTrustStorePassword=changeit LogonTag=553=BANK LogonTag1=554=thepassword
问题分析与解决方向
从日志对比来看,消息解析在Tag146之后直接终止,后续字段全部丢失,可从以下几个方向排查:
- 数据字典组定义问题:检查
FIX44.xml中Tag146(NoRelatedSym)的组结构是否完整,子字段是否全部正确声明。若组定义缺失,QuickFixJ会提前终止解析。 - 临时关闭数据字典校验:将配置中
UseDataDictionary改为N,验证是否能接收完整消息。若恢复正常,说明问题出在数据字典的定义上。 - 字段格式兼容性:检查原始消息中Tag307的值包含空格,确认数据字典中该字段是否被定义为字符串类型,错误的类型定义会导致解析中断。
- 版本升级:QuickFixJ 2.3.1存在已知的组解析bug,尝试升级到2.3.6及以上稳定版本,验证是否修复该问题。
内容的提问来源于stack exchange,提问作者Chris Milburn

