You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QuickFIX/J 2.1.1无法获取FIX消息中已存在的6610字段求助

解决QuickFIX 2.1.1中无法获取MarketDataRequest内6610字段的问题

问题背景

使用QuickFIX 2.1.1处理FIX MarketDataRequest(msgtype=V)消息时,日志中明确显示消息包含6610字段,但调用marketDataRequest.getField(new StringField(6610))时抛出错误:

Field was not found in message, field=6610

原因分析

从消息XML定义可以看到,6610(Time字段)属于NoRelatedSym(146)重复组,并非主消息的顶级字段。QuickFIX的消息对象仅能直接获取顶级字段,组内字段必须先获取对应的组实例,再从组内提取,直接从主消息调用getField会找不到组内字段。

解决方案

修改代码逻辑,先获取NoRelatedSym组对象,再从组内提取6610字段:

单一组实例的处理代码

private KeyContext extractKeyContext(MarketDataRequest marketDataRequest) throws FieldNotFound {
    LOGGER.info("Inside extractKeyContext()");
    KeyContext keyContext = null;
    try {
        LOGGER.info("Inside extractKeyContext() with MarketDataRequest: {}", marketDataRequest);
        
        // 获取第一个NoRelatedSym组(组索引从1开始)
        Group noRelatedSymGroup = marketDataRequest.getGroup(1, new NoRelatedSym());
        // 从组内提取6610字段
        StringField time = (StringField) noRelatedSymGroup.getField(new StringField(6610));
        LOGGER.info("time [{}]", time);
        
        // 初始化并填充keyContext(根据业务需求补充)
        keyContext = new KeyContext();
        // keyContext.setTime(time.getValue());
        
    } catch (Exception e) {
        LOGGER.error("Error while extracting keyContext:[{}],[{}],[{}]", e.getMessage(), e.getCause(), e.getStackTrace());
    }
    LOGGER.info("Inside extractKeyContext() - extracted keyContext [{}]", keyContext);
    return keyContext;
}

多组实例的遍历处理

如果消息中包含多个NoRelatedSym组,需要循环遍历所有组:

private KeyContext extractKeyContext(MarketDataRequest marketDataRequest) throws FieldNotFound {
    LOGGER.info("Inside extractKeyContext()");
    KeyContext keyContext = null;
    try {
        LOGGER.info("Inside extractKeyContext() with MarketDataRequest: {}", marketDataRequest);
        
        // 获取NoRelatedSym组的总数
        int groupCount = marketDataRequest.getInt(NoRelatedSym.FIELD);
        for (int i = 1; i <= groupCount; i++) {
            Group noRelatedSymGroup = marketDataRequest.getGroup(i, new NoRelatedSym());
            StringField time = (StringField) noRelatedSymGroup.getField(new StringField(6610));
            LOGGER.info("Group {} time [{}]", i, time);
            
            // 根据业务逻辑处理每个组的字段
            // ...
        }
        
        keyContext = new KeyContext();
        // ... 其他业务逻辑
        
    } catch (Exception e) {
        LOGGER.error("Error while extracting keyContext:[{}],[{}],[{}]", e.getMessage(), e.getCause(), e.getStackTrace());
    }
    LOGGER.info("Inside extractKeyContext() - extracted keyContext [{}]", keyContext);
    return keyContext;
}

注意事项

  • 确保使用的MarketDataRequest和NoRelatedSym类是基于提供的XML消息定义正确生成的,否则组与字段的映射会失效。
  • QuickFIX中重复组的索引从1开始,而非0。

内容的提问来源于stack exchange,提问作者chaitalipatil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 05:12:39