This is a FIX initiator that connects to the pre-defined host and port. When the session is established, the “MarketDataIncrementalRefresh”(MsgType=‘X’) FIX message is sent to the counterparty. This message contains 2 custom tags defined in the dialect file.
This sample can be run together with the “DialectSellSide” sample. The “DialectSellSide” must be started first.
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | import biz.onixs.fix.dictionary.Version; import biz.onixs.fix.engine.Engine; import biz.onixs.fix.engine.Session; import biz.onixs.fix.parser.Group; import biz.onixs.fix.parser.Message; import biz.onixs.fix.tag.FIX44.Tag; import biz.onixs.util.Utils; import biz.onixs.util.settings.PropertyBasedSettings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * FIX Initiator - Buy Side. With dialect support. */ public class DialectBuySide implements Session.InboundApplicationMessageListener, Session.StateChangeListener { private static final Logger LOG = LoggerFactory.getLogger(DialectBuySide. class ); public void run() { final PropertyBasedSettings settings = new PropertyBasedSettings( "sample/DialectBuySide.properties" ); // Dialect configuration parameter is set in the properties file. LOG.info( "Starting the Engine..." ); final Engine engine = Engine.init(settings); final Version fixVersion = Version.getById(settings.getString( "FIXVersion" )); final String senderCompID = settings.getString( "SenderCompID" ); final String targetCompID = settings.getString( "TargetCompID" ); final Session sn = new Session(senderCompID, targetCompID, fixVersion, false ); sn.setSenderSubID( "SenderSubID (50) field" ) .setInboundApplicationMessageListener( this ) .addStateChangeListener( this ); // Utils.waitForEnter( "Press 'Enter' to establish connection." + " Make sure that the counterparty is ready, for instance 'DialectSellSide' application is started." ); // sn.logonAsInitiator(settings.getString( "CounterpartyHost" ), settings.getInteger( "CounterpartyPort" )); Utils.waitForEnter( "Press 'Enter' to send the message." ); // Create and send message with custom tags. final Message messageX = Message.create( "X" , fixVersion); final Group group = messageX.setGroup(Tag.NoMDEntries, 1 ); group.set(Tag.MDUpdateAction, 0 , 0 /* New */ ) .set( 5450 , 0 , "customValue0" ).set( 5451 , 0 , "customValue1" ); sn.send(messageX); LOG.info( "Message sent: {}\n" , messageX); Utils.waitForEnter( "Press 'Enter' to disconnect the session and terminate the application." ); sn.logout( "The session is disconnected by BuySide" ); sn.dispose(); // LOG.info( "Engine shutdown..." ); engine.shutdown(); } @Override public void onInboundApplicationMessage( final Object sender, final Session.InboundApplicationMessageArgs args) { LOG.info( "Incoming application-level message:\n{}" , args.getMsg()); // Processing of the application-level incoming message ... } @Override public void onStateChange( final Object sender, final Session.StateChangeArgs args) { LOG.info( "New session state: {}" , args.getNewState()); } public static void main( final String[] args) { try { LOG.info( "DialectBuySide" ); LOG.info( "The application is starting..." ); final DialectBuySide buySide = new DialectBuySide(); buySide.run(); } catch ( final Throwable throwable) { LOG.error(throwable.getMessage(), throwable); } finally { LOG.info( "The application is stopped." ); } } } |
This is a FIX acceptor that waits for incoming connections on the pre-defined port (ListenPort). The acceptor session is configured with dialect file. If the incoming application-level message is not valid then the “Email” (MsgType=‘C’) message is sent back.
This sample can be run together with the “DialectBuySide” sample. The “DialectSellSide” must be started first.
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | import biz.onixs.fix.dictionary.Version; import biz.onixs.fix.engine.Engine; import biz.onixs.fix.engine.Session; import biz.onixs.fix.parser.Group; import biz.onixs.fix.parser.Message; import biz.onixs.fix.parser.MessageValidationFlags; import biz.onixs.fix.tag.FIX44.Tag; import biz.onixs.util.TimestampFormat; import biz.onixs.util.Utils; import biz.onixs.util.settings.PropertyBasedSettings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Processes incoming messages. */ public class DialectSellSide implements Session.InboundApplicationMessageListener, Session.StateChangeListener, Session.ErrorListener, Session.WarningListener { private static final Logger LOG = LoggerFactory.getLogger(DialectSellSide. class ); private int orderCounter = 0 ; private Version fixVersion = null ; void run() { final PropertyBasedSettings settings = new PropertyBasedSettings( "sample/DialectSellSide.properties" ); // Dialect configuration parameter is set in the properties file. LOG.info( "Starting the Engine..." ); final Engine engine = Engine.init(settings); // fixVersion = Version.getById(settings.getString( "FIXVersion" )); final String senderCompID = settings.getString( "SenderCompID" ); final String targetCompID = settings.getString( "TargetCompID" ); final Session sn = new Session(senderCompID, targetCompID, fixVersion, false ); // sn.setInboundApplicationMessageListener( this ) .addStateChangeListener( this ) .setErrorListener( this ) .setWarningListener( this ) .setSendingTimeFormat(TimestampFormat.YYYYMMDDHHMMSSMsec); // sn.logonAsAcceptor(); LOG.info( "Awaiting session-initiator..." ); // Utils.waitForEnterToTerminateApp(); // sn.logout(); sn.dispose(); // LOG.info( "Engine shutdown..." ); engine.shutdown(); } @Override public void onInboundApplicationMessage( final Object sender, final Session.InboundApplicationMessageArgs args) { LOG.info( "Incoming application-level message:\n{}" , args.getMsg()); try { args.getMsg().validate(MessageValidationFlags.Strict); } catch ( final RuntimeException ex) { final Message email = Message.create( "C" , fixVersion); email.set(Tag.EmailType, "0" ); final Group group = email.setGroup(Tag.NoLinesOfText, 1 ); final String errorMsg = "Exception during the processing of incoming message: " + ex; group.set(Tag.Text, 0 , errorMsg); final Session sn = (Session) sender; sn.send(email); LOG.error(errorMsg); } } @Override public void onStateChange( final Object sender, final Session.StateChangeArgs args) { LOG.info( "New session state: {}" , args.getNewState()); } @Override public void onError( final Object sender, final Session.ErrorArgs args) { LOG.error( "Error condition: {}" , args); } @Override public void onWarning( final Object sender, final Session.WarningArgs args) { LOG.warn( "Warning condition: {}" , args); } public static void main( final String[] args) { try { LOG.info( "DialectSellSide" ); LOG.info( "The application is starting..." ); final DialectSellSide dialectSellSide = new DialectSellSide(); dialectSellSide.run(); } catch ( final Throwable throwable) { LOG.error(throwable.getMessage(), throwable); } finally { LOG.info( "The application is stopped." ); } } } |