首页 > 解决方案 > 序列 #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;

    }
}

谁能帮我解决这个问题?提前谢谢了 !

标签: javabloombergfix-protocolquickfixj

解决方案


这个配置文件解决了这个问题:

[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

推荐阅读