Skip to content

Commit 6c1c7a4

Browse files
author
baoying.wang
committed
refactor - structure change; add code generator; etc
1 parent 939d94d commit 6c1c7a4

15 files changed

Lines changed: 631 additions & 257 deletions

.classpath

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<classpath>
33
<classpathentry kind="src" path="src/main/java"/>
44
<classpathentry kind="src" path="src/main/resources"/>
5-
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.8.0_101_x86"/>
5+
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.8.0_111_x64"/>
66
<classpathentry kind="lib" path="lib/apache-log4j-extras-1.1.jar"/>
77
<classpathentry kind="lib" path="lib/commons-io-2.5.jar"/>
88
<classpathentry kind="lib" path="lib/guava-19.0.jar"/>
@@ -14,5 +14,7 @@
1414
<classpathentry kind="lib" path="lib/log4j-core-2.6.2.jar"/>
1515
<classpathentry kind="lib" path="lib/log4j-slf4j-impl-2.6.2.jar"/>
1616
<classpathentry kind="lib" path="lib/slf4j-api-1.6.4.jar"/>
17+
<classpathentry kind="lib" path="lib/quickfixj-codegenerator-1.6.0.jar"/>
18+
<classpathentry kind="lib" path="C:/no_synced/dev.libs/org.quickfixj-1.6.0/quickfixj-messages-all-1.6.0.jar"/>
1719
<classpathentry kind="output" path="bin"/>
1820
</classpath>
27.2 KB
Binary file not shown.
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package qfjtutorial.begin;
2+
3+
import quickfix.Application;
4+
import quickfix.DoNotSend;
5+
import quickfix.FieldNotFound;
6+
import quickfix.IncorrectDataFormat;
7+
import quickfix.IncorrectTagValue;
8+
import quickfix.Message;
9+
import quickfix.RejectLogon;
10+
import quickfix.SessionID;
11+
import quickfix.UnsupportedMessageType;
12+
13+
/**
14+
*
15+
// "from" means from remote endpoint
16+
// "to" means to remote endpoint *
17+
*/
18+
public class FirstMessageCallback implements Application {
19+
20+
21+
@Override
22+
public void fromAdmin(Message paramMessage, SessionID paramSessionID)
23+
throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon {
24+
System.out.println("fromAdmin session received : " + paramMessage.toString());
25+
26+
}
27+
28+
@Override
29+
public void fromApp(Message paramMessage, SessionID paramSessionID)
30+
throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType {
31+
System.out.println("fromApp session received : " + paramMessage.toString());
32+
33+
}
34+
35+
@Override
36+
public void onCreate(SessionID paramSessionID) {
37+
System.out.println("onCreate session : " + paramSessionID.toString());
38+
}
39+
40+
@Override
41+
public void onLogon(SessionID paramSessionID) {
42+
System.out.println("onLogon session : " + paramSessionID.toString());
43+
44+
}
45+
46+
@Override
47+
public void onLogout(SessionID paramSessionID) {
48+
System.out.println("onLogout session : " + paramSessionID.toString());
49+
50+
}
51+
52+
@Override
53+
public void toAdmin(Message paramMessage, SessionID paramSessionID) {
54+
System.out.println("toAdmin session send : " + paramMessage.toString());
55+
56+
}
57+
58+
@Override
59+
public void toApp(Message paramMessage, SessionID paramSessionID) throws DoNotSend {
60+
System.out.println("toApp session send : " + paramMessage.toString());
61+
62+
}
63+
64+
}
Lines changed: 29 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -1,128 +1,50 @@
11
package qfjtutorial.begin;
22

3-
import java.util.Iterator;
4-
import java.util.concurrent.CountDownLatch;
53
import java.util.concurrent.TimeUnit;
64

7-
import org.slf4j.Logger;
8-
import org.slf4j.LoggerFactory;
9-
10-
import qfjtutorial.common.DefaultMessageCallback;
11-
import qfjtutorial.common.DefaultSessionStateListener;
125
import quickfix.Application;
136
import quickfix.DefaultMessageFactory;
7+
import quickfix.FileLogFactory;
148
import quickfix.FileStoreFactory;
159
import quickfix.LogFactory;
1610
import quickfix.Message;
11+
import quickfix.MessageFactory;
1712
import quickfix.MessageStoreFactory;
18-
import quickfix.SLF4JLogFactory;
1913
import quickfix.Session;
20-
import quickfix.SessionID;
21-
import quickfix.SessionNotFound;
2214
import quickfix.SessionSettings;
2315
import quickfix.SocketInitiator;
2416

25-
//the session has been setup at both client and server side, in related configuration files
26-
//You could setup your own log4j2 file, e.g.-Dlog4j.configurationFile=qfjtutorial/common/ConsoleOnly.log4j2.xml
17+
//This is a simplified version.
18+
//For production code, please read common.DefaultQFJSingleSessionInitiator.
2719
public class FirstQFJClient {
2820

29-
protected final static Logger log = LoggerFactory.getLogger(FirstQFJClient.class);
30-
31-
private final String _appConfigInClasspath;
32-
private final SessionSettings _settings;
33-
private final MessageStoreFactory _storeFactory;
34-
private final LogFactory _logFactory;
35-
private final Application _msgCallback;
36-
37-
// Each configuration file could include multi session. In this example,
38-
// only single session.
39-
private final SessionID _sessionID;
40-
41-
private final SocketInitiator _initiator;
42-
43-
private final CountDownLatch _latchForLogonResponse;
44-
45-
public FirstQFJClient(String appConfigInClasspath, Application msgCallback) throws Exception {
46-
47-
_appConfigInClasspath = appConfigInClasspath;
48-
log.info("qfj client begin initializing, with app configuration file in classpath:{}", appConfigInClasspath);
49-
50-
_msgCallback = msgCallback;
51-
52-
_settings = new SessionSettings(appConfigInClasspath);
53-
log.info("_settings.size(): {}", _settings.size());
54-
if (_settings.size() != 1) {
55-
String errorInfo = "For this simple app, expect 1 session definition in settings, but found "
56-
+ _settings.size();
57-
log.error(errorInfo);
58-
throw new RuntimeException(errorInfo);
59-
}
60-
SessionID sessionID = null;
61-
for (final Iterator<SessionID> i = _settings.sectionIterator(); i.hasNext();) {
62-
sessionID = i.next();
63-
log.info("session in the configuration : " + sessionID.toString());
64-
}
65-
_sessionID = sessionID;
66-
67-
// Other store factory, e.g. quickfix.JdbcStoreFactory,
68-
// quickfix.MemoryStoreFactory, quickfix.SleepycatStoreFactory. See QFJ
69-
// Advanced.
70-
_storeFactory = new FileStoreFactory(_settings);
71-
72-
// Other log factory are supported, too , e.g.quickfix.ScreenLogFactory,
73-
// quickfix.JdbcLogFactory, quickfix.CompositeLogFactory,
74-
// quickfix.SLF4JLogFactory. See QFJ-Advanced.
75-
// quickfix.FileLogFactory
76-
_logFactory = new SLF4JLogFactory(_settings);
77-
78-
// This is single thread. For multi-thread, see
79-
// quickfix.ThreadedSocketInitiator, and QFJ-Advanced.
80-
_initiator = new SocketInitiator(_msgCallback, _storeFactory, _settings, _logFactory,
81-
new DefaultMessageFactory());
82-
83-
_latchForLogonResponse = new CountDownLatch(1);
21+
public static void main(String[] args) throws Exception {
8422

85-
log.info("qfj client initialized, with app configuration file in classpath:{}", appConfigInClasspath);
23+
String configurationFileInClasspath = "qfjtutorial/begin/FirstQFJClient.qfj.config.txt";
8624

87-
}
25+
Application application = new FirstMessageCallback();
8826

89-
// start is NOT put in constructor deliberately, to let it pair with
90-
// shutdown
91-
public void start() throws Exception {
92-
93-
log.info("qfj client start, {}", _appConfigInClasspath);
94-
95-
_initiator.start();
96-
97-
//session is created during Connector.start();
98-
Session session = Session.lookupSession(_sessionID);
99-
session.addStateListener(new DefaultSessionStateListener(_sessionID){
100-
@Override
101-
public void onLogon() {
102-
log.debug("InternalSessionStateListener onLogon session:{}", _sessionID.toString());
103-
_latchForLogonResponse.countDown();
104-
}
105-
});
106-
_latchForLogonResponse.await();
107-
108-
log.info("qfj client started, {}", _appConfigInClasspath);
109-
}
27+
SessionSettings settings = new SessionSettings(configurationFileInClasspath);
28+
MessageStoreFactory storeFactory = new FileStoreFactory(settings);
29+
LogFactory logFactory = new FileLogFactory(settings);
30+
MessageFactory messageFactory = new DefaultMessageFactory();
11031

111-
public void stop() throws Exception {
32+
SocketInitiator initiator = new SocketInitiator(application, storeFactory, settings, logFactory,
33+
messageFactory);
11234

113-
log.info("qfj client stop, {}", _appConfigInClasspath);
35+
initiator.start();
11436

115-
_initiator.stop();
37+
// after start, you have to wait several seconds before sending
38+
// messages.
39+
// in production code, you should check the response Logon message.
40+
// Refer: DefaultQFJSingSessionInitiator.java
41+
TimeUnit.SECONDS.sleep(3);
11642

117-
log.info("qfj client stopped, {}", _appConfigInClasspath);
118-
}
43+
Session.sendToTarget(buildHarcodedNewOrderSingleForTest());
44+
Session.sendToTarget(buildHarcodedNewOrderSingleForTest());
11945

120-
// the 49 and 56 value of the message will be used to identify the FIX
121-
// session
122-
// if you don't know what's the tag 49 and 56, please read FIX session
123-
// specification.
124-
public void send(Message message) throws SessionNotFound {
125-
quickfix.Session.sendToTarget(message, _sessionID);
46+
TimeUnit.SECONDS.sleep(3);
47+
initiator.stop();
12648
}
12749

12850
private static Message buildHarcodedNewOrderSingleForTest() {
@@ -137,6 +59,12 @@ private static Message buildHarcodedNewOrderSingleForTest() {
13759
*/
13860
// NewOrderSingle
13961
Message newOrderSingle = new Message();
62+
// It is not required to set 8,49,56 if you know SessionID. See
63+
// DefaultSQFSingleSessionInitiator.java
64+
newOrderSingle.getHeader().setString(8, "FIXT.1.1");
65+
newOrderSingle.getHeader().setString(49, "abcClientCompID");
66+
newOrderSingle.getHeader().setString(56, "xyzServerCompID");
67+
14068
newOrderSingle.getHeader().setString(35, "D");
14169
newOrderSingle.setString(11, "ClOrdID_" + System.currentTimeMillis());
14270
newOrderSingle.setString(55, "USDJPY"); // non-repeating group
@@ -152,22 +80,4 @@ private static Message buildHarcodedNewOrderSingleForTest() {
15280

15381
}
15482

155-
public static void main(String[] args) throws Exception {
156-
157-
Application msgCallback = new DefaultMessageCallback();
158-
String configurationFileInClasspath = "qfjtutorial/begin/FirstQFJClient.qfj.config.txt";
159-
FirstQFJClient client = new FirstQFJClient(configurationFileInClasspath, msgCallback);
160-
client.start();
161-
162-
TimeUnit.SECONDS.sleep(3);
163-
164-
for (int i = 0; i < 3; i++) {
165-
166-
Message newOrderSingle = buildHarcodedNewOrderSingleForTest();
167-
client.send(newOrderSingle);
168-
169-
//TimeUnit.SECONDS.sleep(1);
170-
TimeUnit.MILLISECONDS.sleep(10);
171-
}
172-
}
17383
}
Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
1+
#all entries can be found here http://www.quickfixj.org/quickfixj/usermanual/1.6.4/usage/configuration.html
2+
13
[default]
24
StartTime=00:00:00
35
EndTime=00:00:00
46
HeartBtInt=30
57
ReconnectInterval=5
68

7-
#logging
8-
#http://www.quickfixj.org/quickfixj/usermanual/1.5.0/usage/configuration.html#Logging
9+
#Storage
10+
#http://www.quickfixj.org/quickfixj/usermanual/1.6.4/usage/configuration.html#Storage
911
FileStorePath=./fileStore/FirstQFJClient
12+
13+
#Logging
14+
#http://www.quickfixj.org/quickfixj/usermanual/1.6.4/usage/configuration.html#Logging
15+
#The File* entries are for FileLogFactory ONLY.
1016
FileLogPath=log/FirstQFJClient
1117
FileLogHeartbeats=Y
1218
FileIncludeMilliseconds=Y
@@ -22,35 +28,33 @@ ConnectionType=initiator
2228
SenderCompID=abcClientCompID
2329
TargetCompID=xyzServerCompID
2430

25-
26-
BeginString=FIXT.1.1
27-
2831
#
2932
#remote server
3033
#
3134
SocketConnectHost=localhost
3235
SocketConnectPort=17005
3336

34-
#8 - 5.0SP1
37+
#FIX.4.0,FIX.4.1,FIX.4.2,FIX.4.3,FIX.4.4
38+
#FIXT.1.1 (which then requires DefaultApplVerID, see below)
39+
BeginString=FIXT.1.1
40+
41+
#2 = FIX40, 3 = FIX41, 4 = FIX42, 5 = FIX43, 6 = FIX44, 7 = FIX50, 8 = FIX50SP1, 9 = FIX50SP2
3542
#http://www.onixs.biz/fix-dictionary/5.0.SP1/tagNum_1128.html
3643
DefaultApplVerID=8
3744

38-
#NOT required for none FIT1.1
45+
#Only required for FIT1.1 (5.0SP1 and 5.0SP2, etc)
3946
TransportDataDictionary=dictionary/FIXT11.xml
4047

4148
UseDataDictionary=Y
4249
AppDataDictionary=dictionary/FIX50SP1.xml
4350

4451
ResetOnLogon=Y
45-
#ResetOnLogon=N
52+
4653

4754
#If set to N, fields that are out of order (i.e. body fields in the header, or header fields in the body) will not be rejected.
4855
#Useful for connecting to systems which do not properly order fields.
49-
#http://www.quickfixengine.org/quickfix/doc/html/configuration.html
50-
#http://www.quickfixj.org/quickfixj/usermanual/1.5.1/usage/configuration.html
5156
ValidateFieldsOutOfOrder=N
5257

5358
#Session validation setting for enabling whether field ordering is * validated.
5459
#Values are "Y" or "N". Default is "Y".
55-
#http://www.quickfixj.org/quickfixj/usermanual/1.5.1/usage/configuration.html
5660
ValidateUnorderedGroupFields=N

0 commit comments

Comments
 (0)