user16806803
user16806803

Reputation:

QuickFIX/J Encountered END_OF_STREAM with Bloomberg SSL

I'm having a problem when setting up a connection to Bloomberg using QuickFixJ. I am getting a Disconnecting: Encountered END_OF_STREAM message. And yet, I cannot see where this error comes from. My configuration file :

[default]
FileStorePath=target/data/quickfixlogs
FileLogPath=target/data/quickfixlogs
ConnectionType=initiator
BeginString=FIXT.1.1
SenderCompID=ARHGBETA
TargetCompID=BBGBETA
SessionQualifier=****
DefaultApplVerID=FIX.5.0SP2
StartTime=00:00:00
EndTime=00:00:00
HeartBtInt=30
ReconnectInterval=5
SocketConnectPort=8228
SocketConnectHost=69.191.198.38
UseDataDictionary=Y
DataDictionary=FIXT11.xml
SSLEnable=Y
SSLProtocols=TLSv1.2
SSLValidateCertificates=Y
SSLCheckCertificateRevocation=N
SSLCertificate=.\[Beta-arhgfx-NY] ServiceId615306\pem\cert.pem
SSLCACertificate=.\[Beta-arhgfx-NY] ServiceId615306\pem\CACerts.pem
SSLKeyFile=.\[Beta-arhgfx-NY] ServiceId615306\pem\key.pem
SSLRequireClientCertificate=Y

[session]
BeginString=FIXT.1.1
SenderCompID=****
TargetCompID=****
DefaultApplVerID=FIX.5.0SP2
SessionQualifier=****
StartTime=00:00:00
EndTime=00:00:00
HeartBtInt=30
ReconnectInterval=5
SocketConnectPort=8228
SocketConnectHost=69.191.198.38
SocketConnectPort1=8228
SocketConnectHost1=69.191.198.38
SocketConnectPort2=8228
SocketConnectHost2=69.191.230.38
UseDataDictionary=Y
DataDictionary=FIXT11.xml
SSLEnable=Y
SSLProtocols=TLSv1.2
SSLValidateCertificates=Y
SSLCheckCertificateRevocation=N
SSLCertificate=.\[Beta-arhgfx-NY] ServiceId615306\pem\cert.pem
SSLCACertificate=.\[Beta-arhgfx-NY] ServiceId615306\pem\CACerts.pem
SSLKeyFile=.\[Beta-arhgfx-NY] ServiceId615306\pem\key.pem
SSLCheckCertificateRevocation1=N
SSLCertificate1=.\[Beta-arhgfx-NY] ServiceId615306\pem\cert.pem
SSLCACertificate1=.\[Beta-arhgfx-NY] ServiceId615306\pem\CACerts.pem
SSLKeyFile1=.\[Beta-arhgfx-NY] ServiceId615306\pem\key.pem
SSLCheckCertificateRevocation2=N
SSLCertificate2=.\[Beta-arhgfx-NJ] ServiceId615305\pem\cert.pem
SSLCACertificate2=.\[Beta-arhgfx-NJ] ServiceId615305\pem\CACerts.pem
SSLKeyFile2=.\[Beta-arhgfx-NJ] ServiceId615305\pem\key.pem
SSLRequireClientCertificate=Y

My configuration class :

public class FixConfiguration {

    private final String fileName = "quickfixj.cfg";

    public ThreadedSocketInitiator threadedSocketInitiator(QuickFixJApplication application){
        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;
    }
}

My application class :

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 {

    }
}

My price publication class :

public class BloombergPricePublisher {

    public ThreadedSocketInitiator threadedSocketInitiator;

    public QuickFixJApplication application;


    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{
            SessionID sessionID = this.threadedSocketInitiator.getSessions().stream()
                    .filter(id -> id.getBeginString().equals("FIXT.1.1"))
                    .findFirst()
                    .orElseThrow(RuntimeException::new);
            System.out.println(sessionID);
            Session.sendToTarget(marketDataIncrementalRefresh, sessionID);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    /**
     * Méthode de connection à la session
     * */
    public static void logon (ThreadedSocketInitiator threadedSocketInitiator){
        if(threadedSocketInitiator.getSessions() != null && threadedSocketInitiator.getSessions().size() > 0) {
            for (SessionID sessionID: threadedSocketInitiator.getSessions()) {
                Session.lookupSession(sessionID).logon();
            }
            System.out.println("Connecté");
        }
        else{
            System.out.println("Impossible de se connecter");
        }
    }

    /**
     * Méthode de création d'un nouveau prix pour le publier sur Bloomberg
     * @param marketPrice
     * */
    public MarketDataIncrementalRefresh createMarketDataIncrementalRefresh(MarketPrice marketPrice) {
        MarketDataIncrementalRefresh marketDataIncrementalRefresh = new MarketDataIncrementalRefresh();
        marketDataIncrementalRefresh.set(new NoMDEntries(1));
        marketDataIncrementalRefresh.set(new MDBookType('0'));
        return marketDataIncrementalRefresh;
    }
}

I'm running the code JAR file on a Centos8 VM which port has been whitelisted by Bloomberg.

Upvotes: 1

Views: 1137

Answers (1)

Christoph John
Christoph John

Reputation: 3283

Where did you get all that config options from? You are using QuickFIX/J but it looks like you took some settings from QuickFIX (C++) or quickfix/n (.NET). Please refer to https://www.quickfixj.org/usermanual/2.3.0/usage/configuration.html (you already mentioned it in your other question).

First thing that caught my eye is SSLEnable in your config. This should really be SocketUseSSL

Here is a set of options that works for us. If they don't work for you please talk to Bloomberg if they can see something suspicious in their logs or turn on SSL debug logging to see more information.

SocketUseSSL=Y
EnabledProtocols=TLSv1.2
KeyStoreType=JKS
SocketKeyStore=<absolute-path-to-keystore>
SocketKeyStorePassword=<password>

Might also be related: https://stackoverflow.com/a/60602710/4962355

Upvotes: 1

Related Questions