Reputation:
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
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