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.