java - 序列 #1 的 FIX 消息太低(预期序列 #2)
问题描述
我正在使用 QuickFixJ 在 Bloomberg 上将消息发布到具有不同 IP 的会话上。我可以连接两个会话,但是当我尝试发送消息时,我收到了错误:
收到注销请求:序列#1 的消息太低(预期序列#2)
我的配置文件:
[default]
FileStorePath=target/data/quickfixlogs
FileLogPath=target/data/quickfixlogs
ConnectionType=initiator
BeginString=FIXT.1.1
SenderCompID=****
TargetCompID=****
[session]
BeginString=FIXT.1.1
SenderCompID=****
TargetCompID=*****
DefaultApplVerID=FIX.5.0SP2
SessionQualifier=****
StartTime=00:00:00
EndTime=00:00:00
HeartBtInt=10
ResetSeqNumFlag=Y
ReconnectInterval=5
UseDataDictionary=Y
DataDictionary=FIXT11.xml
SocketConnectPort=8228
SocketConnectHost=69.191.198.38
SocketKeyStore=*****
SocketKeyStorePassword=*****
SocketUseSSL=Y
EnabledProtocols=TLSv1.2
KeyStoreType=JKS
[session]
BeginString=FIXT.1.1
SenderCompID=*****
TargetCompID=*****
DefaultApplVerID=FIX.5.0SP2
SessionQualifier=*****
StartTime=00:00:00
EndTime=00:00:00
HeartBtInt=10
ResetSeqNumFlag=Y
ReconnectInterval=5
UseDataDictionary=Y
DataDictionary=FIXT11.xml
SocketConnectPort=8228
SocketConnectHost=69.191.230.38
SocketKeyStore=*****
SocketKeyStorePassword=*****
SocketUseSSL=Y
EnabledProtocols=TLSv1.2
KeyStoreType=JKS
我已尝试设置 ResetSeqNumFlag=Y/N 但我仍然收到相同的错误消息。
彭博的文件指出:
根据“FIX Transport 1.1”规范(https://www.fixtrading.org/standards/fixt/)。以下是 FIXT1.1 规范的摘录: 建议在每 24 小时内建立一次新的 FIX 会话。可以通过发送带有 ResetSeqNumFlag 集的登录消息来保持 24 小时连接并建立一组新的序列号。当使用ResetSeqNumFlag保持24小时连通并建立新的序列号时,流程应该如下。双方应就重置时间和将成为流程发起方的一方达成一致。请注意,ResetSeqNum 进程的发起者可能与 Logon 进程的发起者不同。一方将通过发送 TestRequest 来启动该过程并等待 Heartbeat 响应以确保没有序列号间隙。收到心跳后,发起者应该发送一个 Logon,ResetSeqNumFlag 设置为 Y,MsgSeqNum 为 1。接受者应该响应一个 Logon,ResetSeqNumFlag 设置为 Y,MsgSeqNum 为 1。此时,来自任何一方的新消息都应该继续 MsgSeqNum 为 2。需要注意的是,一旦发起者发送了设置了 ResetSeqNumFlag 的 Logon,接受者必须服从这个请求,最后发送的“昨天”序列号的消息可能不再可用。如果此过程已启动但未正确执行,则应关闭连接并进行手动干预。需要注意的是,一旦发起者发送了设置了 ResetSeqNumFlag 的 Logon,接受者必须服从这个请求,最后发送的“昨天”序列号的消息可能不再可用。如果此过程已启动但未正确执行,则应关闭连接并进行手动干预。需要注意的是,一旦发起者发送了设置了 ResetSeqNumFlag 的 Logon,接受者必须服从这个请求,最后发送的“昨天”序列号的消息可能不再可用。如果此过程已启动但未正确执行,则应关闭连接并进行手动干预。
但是我看不到如何发送测试请求并等待心跳/仅在接收到测试请求以同步序列号时发送心跳。
我的应用程序代码如下:
public class QuickFixJApplication implements Application {
@Override
public void onCreate(SessionID sessionID) {
}
@Override
public void onLogon(SessionID sessionID) {
}
@Override
public void onLogout(SessionID sessionID) {
}
@Override
public void toAdmin(Message message, SessionID sessionID) {
}
@Override
public void fromAdmin(Message message, SessionID sessionID) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon {
}
@Override
public void toApp(Message message, SessionID sessionID) throws DoNotSend {
}
@Override
public void fromApp(Message message, SessionID sessionID) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType {
}
}
我用来配置会话的代码:
public class FixConfiguration {
public static final String quickfixj = "quickfixj.cfg";
public ThreadedSocketInitiator threadedSocketInitiator(QuickFixJApplication application, String fileName){
ThreadedSocketInitiator threadedSocketInitiator = null;
try {
SessionSettings settings = new SessionSettings(new FileInputStream(fileName));
MessageStoreFactory storeFactory = new FileStoreFactory(settings);
LogFactory logFactory = new FileLogFactory(settings);
MessageFactory messageFactory = new DefaultMessageFactory();
threadedSocketInitiator = new ThreadedSocketInitiator(application, storeFactory, settings, logFactory, messageFactory);
} catch (Exception e) {
e.printStackTrace();
}
return threadedSocketInitiator;
}
}
我用来发布价格的代码:
public class BloombergPricePublisher {
public ThreadedSocketInitiator threadedSocketInitiator;
public QuickFixJApplication application;
/**
* Constructeur de BloombergPricePublisher qui prend en paramètres :
* @param application : l'application QuickFixJ initialisée
* */
public BloombergPricePublisher(QuickFixJApplication application, ThreadedSocketInitiator threadedSocketInitiator){
super();
this.application = application;
this.threadedSocketInitiator = threadedSocketInitiator;
}
/**
* Méthode de publication d'un prix sur Bloomberg
* */
public void publish(MarketPrice marketPrice) {
MarketDataIncrementalRefresh marketDataIncrementalRefresh = createMarketDataIncrementalRefresh(marketPrice);
try{
for (SessionID sessionID : this.threadedSocketInitiator.getSessions()){
Session.sendToTarget(marketDataIncrementalRefresh, sessionID);
}
}catch (Exception e){
e.printStackTrace();
}
}
/**
* Méthode de création d'un nouveau prix pour le publier sur Bloomberg
* @param marketPrice
* */
public MarketDataIncrementalRefresh createMarketDataIncrementalRefresh(MarketPrice marketPrice) {
quickfix.fix50sp2.MarketDataIncrementalRefresh message = new MarketDataIncrementalRefresh();
quickfix.fix50sp2.MarketDataIncrementalRefresh.NoMDEntries group = new MarketDataIncrementalRefresh.NoMDEntries();
/**
* Ajout prix Bid au message
* */
group.set(new MDUpdateAction('1'));
group.set(new MDEntryType('0'));
group.set(new MDEntryPx(marketPrice.getBid_kech()));
group.set(new Symbol(marketPrice.getCUSIP()));
message.addGroup(group);
/**
* Ajout prix Ask au message
* */
group.set(new MDUpdateAction('1'));
group.set(new MDEntryType('1'));
group.set(new MDEntryPx(marketPrice.getAsk_kech()));
group.set(new Symbol(marketPrice.getCUSIP()));
message.addGroup(group);
return message;
}
}
谁能帮我解决这个问题?提前谢谢了 !
解决方案
这个配置文件解决了这个问题:
[default]
FileStorePath=target/data/quickfix/messages
FileLogPath=target/data/quickfix/logs
ConnectionType=initiator
BeginString=FIXT.1.1
SenderCompID=*****
TargetCompID=*****
[session]
BeginString=FIXT.1.1
SenderCompID=*****
TargetCompID=*****
DefaultApplVerID=FIX.5.0SP2
SessionQualifier=*****
ResetSeqNumFlag=Y
ResetOnLogon=Y
StartTime=00:00:00
EndTime=00:00:00
TimeZone=America/New_York
StartDay=Monday
EndDay=Monday
HeartBtInt=30
ReconnectInterval=5
SocketConnectPort=8228
SocketConnectHost=69.191.198.38
SocketKeyStore=/home/******
SocketKeyStorePassword=****
SocketUseSSL=Y
EnabledProtocols=TLSv1.2
KeyStoreType=JKS
[session]
BeginString=FIXT.1.1
SenderCompID=*****
TargetCompID=*****
DefaultApplVerID=FIX.5.0SP2
SessionQualifier=*****
ResetSeqNumFlag=Y
ResetOnLogon=Y
StartTime=00:00:00
EndTime=00:00:00
TimeZone=America/New_York
StartDay=Monday
EndDay=Monday
HeartBtInt=30
ReconnectInterval=5
SocketConnectPort=8228
SocketConnectHost=69.191.230.38
SocketKeyStore=/home/*****
SocketKeyStorePassword=*****
SocketUseSSL=Y
EnabledProtocols=TLSv1.2
KeyStoreType=JKS
推荐阅读
- hbase - 如何从 Geomesa 中的 hbase 批量获取数据?
- python - python中单个子列表的长度
- json - 如何使用 Bash 创建具有来自许多文件的同一行的值的数组?
- c# - 有没有办法绑定到像文件夹结构一样具有可变数量级别的 UWP TreeView?
- wordpress - 翻译 Divi 已预订
- c++ - CEFsharp 加载 url 保留先前导航的 url
- python - 来自 C 的 Python 中的按位运算
- node.js - 对链接容器的 NGINX HTTP 请求
- sql - 触发 ON 表,该表将 INSERT 触发到另一个具有 NOT NULL 约束的表中
- unity3d - 我如何在 Unity 中读取 .raw 文件?