2012-08-06 238 views
0

我已经创建了两个类:Initiator和Acceptor。我想从发起者发送消息到接受者,然后处理收到的消息。我无法发送消息。如何在quickfix上发送和接收消息?

这是我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(); 
} 

这里是应用程序接口的它的覆盖信息。

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(); 
    } 

} 

这是引发剂initiator.cfg文件

[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 

谁能告诉我问题在哪里。在配置中还是在代码中?

+0

你看到了什么错误?你怎么知道它不工作? – 2012-08-06 13:17:39

+0

布尔结果= quickfix.Session.sendToTarget(message,sessionId);如果(结果){ System.out.println(“Message ahs send :)”); } else { System.out.println(“Not Send”); },否则语句执行 – 2012-08-06 15:37:07

回答

3

您需要对xml文件进行更改。我猜你正在使用的字段没有在fix.4.4文件中声明。检查你的XML文件,并以下列方式包含它。

我想要发送QuoteID与货币,但在货币QuoteID没有声明。在这种情况下,您将无法发送消息。 您需要在fix.4.4 /或您正在使用的任何版本中删除该字段(QuoteID)。

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

也检查日志,你会在那里发现错误信息。

可能是你不包括要求字段,也可以创建问题。 使用以下链接检查需要哪些字段。 http://www.fixprotocol.org/FIXimate3.0/

5

我只想指出显而易见(这段代码有很多错误,请参阅示例以了解quickfixj的工作原理)。您尝试发送的Message不是有效的FIX消息,因此在发送之前会被引擎拒绝。您需要创建一个真正的FIX消息以供quickfix发送。同样重要的是,我需要提及的是toApp是一个事件处理程序,在发送消息时被调用。如果您打电话给quickfix.Session.sendToTarget,它会在发送时再次呼叫toApp。由于您的toApp中没有控制语句,因此会导致无限循环。配置也有点不对,而其他一些代码看起来很拗口,但那些是你最大的问题。请看文档和例子。

+0

大量使用单词hin – gdbj 2016-04-20 17:30:07

相关问题