From the above code, you can see that you have an initiator application (client), and you also need to create an acceptor application (server). Below I have attached two classes that will do what you want.
First, I list the acceptor application:
public class ServerApplication 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 { System.out.println("FromApp: " + message); } public static void main(String[] args) throws ConfigError, FileNotFoundException, InterruptedException, SessionNotFound { SessionSettings settings = new SessionSettings("res/acceptor.config"); Application application = new ServerApplication(); MessageStoreFactory messageStoreFactory = new FileStoreFactory(settings); LogFactory logFactory = new ScreenLogFactory( true, true, true); MessageFactory messageFactory = new DefaultMessageFactory(); Acceptor initiator = new SocketAcceptor(application, messageStoreFactory, settings, logFactory, messageFactory); initiator.start(); CountDownLatch latch = new CountDownLatch(1); latch.await(); } }
This is a server application that will remain running and listen to messages from clients that connect to it. Here is the configuration file ( acceptor.properties ) used by him:
[default] ApplicationID=server FileStorePath=storage/messages/ ConnectionType=acceptor StartTime=00:01:00 Europe/Bucharest EndTime=23:59:00 Europe/Bucharest HeartBtInt=30 UseDataDictionary=Y DataDictionary=FIX42.xml ValidateUserDefinedFields=N ValidateIncomingMessage=N RefreshOnLogon=Y [session] BeginString=FIX.4.2 SocketAcceptPort=9877 SenderCompID=server TargetCompID=client AcceptorTemplate=N lockquote
Next is the client application code. He tries to connect to the server and after that sends him a message:
public class ClientApplication implements Application { private static volatile SessionID sessionID; @Override public void onCreate(SessionID sessionID) { System.out.println("OnCreate"); } @Override public void onLogon(SessionID sessionID) { System.out.println("OnLogon"); ClientApplication.sessionID = sessionID; } @Override public void onLogout(SessionID sessionID) { System.out.println("OnLogout"); ClientApplication.sessionID = null; } @Override public void toAdmin(Message message, SessionID sessionID) { System.out.println("ToAdmin"); } @Override public void fromAdmin(Message message, SessionID sessionID) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon { System.out.println("FromAdmin"); } @Override public void toApp(Message message, SessionID sessionID) throws DoNotSend { System.out.println("ToApp: " + message); } @Override public void fromApp(Message message, SessionID sessionID) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType { System.out.println("FromApp"); } public static void main(String[] args) throws ConfigError, FileNotFoundException, InterruptedException, SessionNotFound { SessionSettings settings = new SessionSettings("res/initiator.config"); Application application = new ClientApplication(); MessageStoreFactory messageStoreFactory = new FileStoreFactory(settings); LogFactory logFactory = new ScreenLogFactory( true, true, true); MessageFactory messageFactory = new DefaultMessageFactory(); Initiator initiator = new SocketInitiator(application, messageStoreFactory, settings, logFactory, messageFactory); initiator.start(); while (sessionID == null) { Thread.sleep(1000); } final String orderId = "342"; NewOrderSingle newOrder = new NewOrderSingle(new ClOrdID(orderId), new HandlInst('1'), new Symbol("6758.T"), new Side(Side.BUY), new TransactTime(new Date()), new OrdType(OrdType.MARKET)); Session.sendToTarget(newOrder, sessionID); Thread.sleep(5000); } }
The configuration file for it ( initiator.config ) is almost the same as the file used for the acceptor:
[default] ApplicationID=client FileStorePath=storage/messages/ ConnectionType=initiator StartTime=00:01:00 Europe/Bucharest EndTime=23:59:00 Europe/Bucharest HeartBtInt=30 UseDataDictionary=Y DataDictionary=FIX42.xml ValidateUserDefinedFields=N ValidateIncomingMessage=N RefreshOnLogon=Y [session] BeginString=FIX.4.2 SocketConnectHost=localhost SocketConnectPort=9877 SenderCompID=client TargetCompID=server
Both configuration files lack some parameters, but enough for testing. Each of the classes has a main method, added only to test the case you need.
Normally, you would deal a little differently with how they start or stop. The server application listens for messages / connections and never stops, while the client application stops immediately after sending the first message.