如何在Golang中使用quickfixgo将字符串解析为QuickFIX消息?
在Golang中使用quickfixgo解析字符串为FIX消息的方法
针对你的场景(从Kafka读取FIX字符串消息后转发至FIX服务器),以下是quickfixgo中常用的解析方案:
1. 带数据字典校验的解析(适合需要字段校验/修改的场景)
如果需要确保消息符合对应FIX版本的规范,或者要修改消息字段,需要先加载对应版本的FIX数据字典(XML格式),再进行解析:
步骤1:加载数据字典
import ( "github.com/quickfixgo/quickfix" "github.com/quickfixgo/quickfix/datadictionary" ) // 加载对应版本的FIX数据字典(例如FIX.4.4) dd, err := datadictionary.Parse("FIX.4.4.xml") if err != nil { // 处理字典加载错误(如文件不存在、格式错误) panic(err) }
步骤2:解析FIX字符串
注意Kafka中存储的字符串可能用其他字符(如|)替代了FIX标准的SOH分隔符(ASCII 0x01),解析前需要先转换回SOH:
import "strings" // 从Kafka获取的FIX字符串示例(此处用|代替SOH) rawFixStr := "8=FIX.4.4|9=156|35=D|49=Sender|56=Target|11=TestOrdID|21=1|40=1|55=AAPL|54=1|38=100|44=150.0|59=0|10=123|" // 将替代符转换为标准SOH分隔符 fixStr := strings.ReplaceAll(rawFixStr, "|", string(quickfix.SOH)) // 解析字符串为quickfix.Message对象 msg, err := quickfix.ParseMessage(fixStr, dd) if err != nil { // 处理解析错误(如格式非法、字段缺失、校验不通过) panic(err) } // 示例:读取消息中的字段 var clOrdID quickfix.StringField if err := msg.Body.Get(&clOrdID); err == nil { println("订单ID:", clOrdID.Value()) }
2. 无校验的轻量解析(仅用于转发场景)
如果只是需要转发消息,不需要校验字段或修改内容,可以跳过数据字典,直接解析(仅做基本的字段拆分,不做规范校验):
import ( "github.com/quickfixgo/quickfix" "strings" ) rawFixStr := "8=FIX.4.4|9=156|35=D|49=Sender|56=Target|11=TestOrdID|21=1|40=1|55=AAPL|54=1|38=100|44=150.0|59=0|10=123|" fixStr := strings.ReplaceAll(rawFixStr, "|", string(quickfix.SOH)) // 传入nil跳过数据字典校验 msg, err := quickfix.ParseMessage(fixStr, nil) if err != nil { // 处理基本的解析错误(如消息结构不完整) panic(err) }
3. 转发解析后的消息
解析完成后,可通过quickfix的会话将消息发送至目标FIX服务器:
// 假设已通过quickfix建立会话,sessionID为目标会话的标识 sessionID := quickfix.SessionID{BeginString: "FIX.4.4", SenderCompID: "YourSender", TargetCompID: "TargetServer"} if err := quickfix.SendToTarget(msg, sessionID); err != nil { // 处理发送错误(如会话断开、发送超时) panic(err) }
部署注意事项(Kubernetes环境)
- 将FIX数据字典文件打包进容器镜像,或通过ConfigMap挂载到容器的指定路径,确保代码能正确读取到字典文件
- 配置Kafka客户端的连接参数(如bootstrap servers),确保Pod能访问Kafka集群
- 确保FIX会话的配置(如心跳间隔、重连策略)符合目标服务器的要求,避免会话断开
内容的提问来源于stack exchange,提问作者user8217890
相关产品推荐
相关产品推荐

