Muneeb Nasir
Muneeb Nasir

Reputation: 2504

How can I send and receive messages on quickfix?

I have created two classes: Initiator and Acceptor. I want to send messages from the initiator to the acceptor and then process the received messages. I can't send message.

This is my initiator.java

SocketInitiator socketInitiator = null;
String fileName = "conf/intiator.cfg";
try {
    SessionSettings initiatorSettings = new SessionSettings(new FileInputStream(fileName));
    Application initiatorApplication = new Initiator();
    FileStoreFactory fileStoreFactory = new FileStoreFactory(
            initiatorSettings);
    FileLogFactory fileLogFactory = new FileLogFactory(
            initiatorSettings);
    MessageFactory messageFactory = new DefaultMessageFactory();
    socketInitiator = new SocketInitiator(initiatorApplication, fileStoreFactory, initiatorSettings, fileLogFactory, messageFactory);
    socketInitiator.start();
    Message msg = new Message();
    msg.setString(1, "Hello this is test Message");


    SessionID sessionId = (SessionID) socketInitiator.getSessions().get(0);
    Session.lookupSession(sessionId).logon();
    initiatorApplication.onLogon(sessionId);
    initiatorApplication.toApp(msg, sessionId);
} catch (Exception e) {
    e.printStackTrace();
}

Here is its overRide message of Application Interface.

public void toApp(Message message, SessionID sessionId) throws DoNotSend {
    try {
        boolean result = quickfix.Session.sendToTarget(message, sessionId);
        if (result) {
            System.out.println("Message ahs send :)");
        } else {
            System.out.println("Not Send");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

}

this is initiator initiator.cfg file

[default]
StartTime=00:00:01
EndTime=23:59:59
HeartBtInt=10
SocketUseSSL=N
MillisecondsInTimeStamp=Y
FileIncludeMilliseconds=Y
CheckLatency=N
SocketTcpNoDelay=Y 


[session]
BeginString=FIX.4.4
ConnectionType=initiator
DisableQuickFixReconnLogic=Y
AdapterUserIndex=0

SocketConnectHost=127.0.0.1

Timezone=America/New_York

SocketConnectPort=3000
UseDataDictionary=Y
DataDictionary=conf/resources/FIX44.xml
ValidateFieldsOutOfOrder=N
ValidateFieldsHaveValues=N
ValidateUserDefinedFields=N
LogonTimeout=10
FileStorePath=conf/connector
FileLogPath=conf/connector/logs
FileLogBackupPath=conf/connector
ResetOnLogout=Y
ResetOnDisconnect=N
SendResetSeqNumFlag=Y
RawData=fxall123
#SessionQualifier=FXallStream
MillisecondsInTimeStamp=Y
FileIncludeMilliseconds=Y

[session]
BeginString=FIX.4.4
ConnectionType=initiator
DisableQuickFixReconnLogic=Y
AdapterUserIndex=1
SenderCompID=initiator-id
#SenderSubID=trader1
#TargetCompID=target-id
#TargetSubID=qftrade

SocketConnectHost=127.0.0.1
Timezone=America/New_York
#SocketConnectPort=443
SocketConnectPort=3000
UseDataDictionary=Y
DataDictionary=conf/resources/FIX44.xml
ValidateFieldsOutOfOrder=N
ValidateFieldsHaveValues=N
ValidateUserDefinedFields=N
LogonTimeout=5
FileStorePath=conf/connector
FileLogPath=conf/connector
FileLogBackupPath=conf/connector/backup
ResetOnLogout=Y
ResetOnLogon=Y
ResetOnDisconnect=N
SendResetSeqNumFlag=Y
RawData=fxall123
#SessionQualifier=FXallTrade

Acceptor.java

String fileName = "conf/acceptor.cfg";
SocketAcceptor socketAcceptor = null;
try {
    FileInputStream is = new FileInputStream(fileName);
    SessionSettings executorSettings = new SessionSettings(is);
    Application application = new Acceptor();
    FileStoreFactory fileStoreFactory = new FileStoreFactory(
            executorSettings);
    MessageFactory messageFactory = new DefaultMessageFactory();
    FileLogFactory fileLogFactory = new FileLogFactory(executorSettings);
    socketAcceptor = new SocketAcceptor(application, fileStoreFactory,
            executorSettings, fileLogFactory, messageFactory);
    socketAcceptor.start();

    SessionID sessionId = (SessionID) socketAcceptor.getSessions().get(0);
    application.onLogon(sessionId);
    int[] i = {1, 2, 3, 4, 5};

    // application.fromApp(new Message(i), sessionId);
} catch (Exception e) {
    e.printStackTrace();
}

acceptor.cfg

[default]
StartTime=00:00:00
EndTime=23:50:00
HeartBtInt=10
ReconnectInterval=6
SocketUseSSL=N
MillisecondsInTimeStamp=Y
CheckLatency=N
SocketTcpNoDelay=N
SocketAcceptAddress=127.0.0.1
SocketAcceptPort=3000

[session]
BeginString=FIX.4.4
ConnectionType=acceptor
#DisableQuickFixReconnLogic=Y
AdapterUserIndex=0
SenderCompID=target-id
#SenderSubID=qfstream
#TargetCompID=inttest
#TargetSubID=trader1
Timezone=America/New_York
UseDataDictionary=Y
DataDictionary=conf/resources/FIX44.xml
ValidateFieldsOutOfOrder=N
ValidateFieldsHaveValues=N
ValidateUserDefinedFields=N
LogonTimeout=5
FileStorePath=conf/Acceptor
FileLogPath=conf/Acceptor/logs
ResetOnLogout=Y
ResetOnDisconnect=N
SendResetSeqNumFlag=Y

Can anyone tell me where is the problem. Either in configuration or in code?

Upvotes: 0

Views: 9141

Answers (2)

Muneeb Nasir
Muneeb Nasir

Reputation: 2504

you need to make changes in xml file. I guess a field that you are using is not declared in fix.4.4 file. Check your xml file and include that in following way.

i-e you want to send QuoteID with Currency, but in Currency QuoteID is not declared. In that case you will not be able to send message. you need to decleared that field(QuoteID) in fix.4.4/or any version you are using.

<Currency>
//
//   
<field name="QuoteID" required="N" /> // N or Y depend on your requirement 
//
//
</currency>

also check log, You will find error message there.

May be you are not including require fields that can also create problem. use Following link to check which fields are required. http://www.fixprotocol.org/FIXimate3.0/

Upvotes: 2

MD-Tech
MD-Tech

Reputation: 1224

I will just point out the obvious (there is a lot wrong with this code, see the examples to understand how quickfixj works). The Message that you are trying to send is not a valid FIX message and so will be rejected by the engine before it is sent. You will need to create a real FIX message for quickfix to send it. Just as importantly I need to mention that toApp is an event handler that gets called when a message is sent. If you put a call to quickfix.Session.sendToTarget in it it will then call toApp again when it gets sent. Since there is no control statement in your toApp this results in an infinite loop. The configuration is also slightly wrong, and other bits of code look hinkey, but those are your biggest problems. Please look at the documentation and examples.

Upvotes: 5

Related Questions