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
相关产品推荐
相关产品推荐

