如何在QuickFIX/J中增强登录消息以满足Acceptor端标签要求?
在QuickFIX/J登录消息中添加指定标签的方法
当然可以给QuickFIX/J的登录(Logon)消息添加Acceptor要求的特定标签(比如95、96),你的登录失败就是因为发送的Logon里缺少这些必填字段,Acceptor直接断开了连接(日志里的END_OF_STREAM就是对方主动关闭了会话)。
具体实现步骤如下:
- 实现QuickFIX/J的
Application接口,重点重写toAdmin方法——这个方法会在所有管理员消息(包括Logon)发送前被调用,正好用来修改Logon消息。 - 在
toAdmin方法里判断当前消息是否为Logon(消息类型MsgType=A),如果是就手动添加95(RawDataLength)和96(RawData)字段。 - 将自定义的Application类配置到你的QuickFIX/J会话设置中。
示例代码如下:
import quickfix.*; import quickfix.field.MsgType; public class CustomLogonApp implements Application { @Override public void toAdmin(Message message, SessionID sessionID) { try { String msgType = message.getString(MsgType.FIELD); // 只处理Logon消息 if (MsgType.LOGON.equals(msgType)) { // 替换成Acceptor要求的RawData内容和对应长度 String rawDataValue = "指定的RawData值"; int rawDataLength = rawDataValue.getBytes().length; // 注意编码匹配Acceptor要求 message.setField(new quickfix.field.RawDataLength(rawDataLength)); message.setField(new quickfix.field.RawData(rawDataValue)); } } catch (FieldNotFound e) { e.printStackTrace(); } } // 实现接口其他必填方法(空实现即可) @Override public void onCreate(SessionID sessionID) {} @Override public void onLogon(SessionID sessionID) {} @Override public void onLogout(SessionID sessionID) {} @Override public void toApp(Message message, SessionID sessionID) throws DoNotSend {} @Override public void fromAdmin(Message message, SessionID sessionID) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon {} @Override public void fromApp(Message message, SessionID sessionID) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType {} }
注意事项:
- 必须确保
RawDataLength(95)的值和RawData(96)的实际字节数完全匹配,编码格式也要和Acceptor保持一致(比如UTF-8或ASCII)。 - 确认Acceptor要求的
RawData具体内容,不能随便填。
内容的提问来源于stack exchange,提问作者dxps
相关产品推荐
相关产品推荐

