Samples :: Dynamic Acceptor

Dynamic Acceptor Sample

Description

This is a Dynamic FIX Acceptor that waits for incoming connection and accepting FIX session without a prior creation of session object.

Usage

  • Run the sample:
    • win: 1-DynamicAcceptor.bat
    • linux: 1-DynamicAcceptor.sh
  • Clean everything:
    • win: clean.bat
    • linux: clean.sh

Source Code

import biz.onixs.fix.engine.Engine;
import biz.onixs.fix.engine.Session;
import biz.onixs.fix.engine.SessionId;
import biz.onixs.fix.engine.storage.SessionStorageType;
import biz.onixs.fix.tag.Tag;
import biz.onixs.util.Utils;
import biz.onixs.util.settings.PropertyBasedSettings;
import biz.onixs.util.settings.Settings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * This is a Dynamic FIX Acceptor that waits for incoming connection and accepting
 * FIX session without a prior creation of session object or rejects it.
 */
public class DynamicAcceptor implements Engine.DynamicAcceptorListener, Runnable {
    private static final Logger LOG = LoggerFactory.getLogger(DynamicAcceptor.class);
    private static final String SETTINGS_RESOURCE = "sample/DynamicAcceptor.properties";
    private Settings settings = null;

    @Override
    public void run() {
        try {
            LOG.info("DynamicAcceptor");
            LOG.info("The application is starting...");
            //
            LOG.info("Loading settings from: {}", SETTINGS_RESOURCE);
            settings = new PropertyBasedSettings(SETTINGS_RESOURCE);
            //
            LOG.info("Starting the Engine...");
            final Engine engine = Engine.init(settings);
            //
            LOG.info("Register dynamic acceptor listener ...");
            //
            engine.addDynamicAcceptorListener(this);
            //
            Utils.waitForEnterToTerminateApp();
            //
            LOG.info("Engine shutdown...");
            engine.shutdown();
        }  catch (final RuntimeException e) {
            LOG.error(e.getMessage(), e);
        } finally {
            LOG.info("The application is stopped.");
        }
    }

    @Override
    public void onDynamicAcceptor(final Object sender, final Engine.DynamicAcceptorArgs args) {
        final SessionId sessionId = args.getSessionId();
        LOG.info("Dynamic acceptor: {}, logon message {}", sessionId, args.getIncomingLogonMessage());
        if ("CorrectPassword".equals(args.getIncomingLogonMessage().getFlatMessage().get(Tag.Password))) {
            final Session session = new Session(sessionId,
                    settings.getBoolean("keepSequenceNumbersBetweenFixConnections"), SessionStorageType.FileBasedStorage);
            LOG.info("Session created: {}", session);
            args.setCreatedSession(session);
        } else {
            args.setRejectReason("Face control failed");
        }
    }

    private static class RejectingLogic implements Engine.DynamicAcceptorListener {

        @Override
        public void onDynamicAcceptor(final Object sender, final Engine.DynamicAcceptorArgs args) {
            final SessionId sessionId = args.getSessionId();
            LOG.info("Dynamic acceptor: {}, logon message {}", sessionId, args.getIncomingLogonMessage());
        }
    }

    public static void main(final String[] args) {
        (new DynamicAcceptor()).run();
    }
}

Accepted Buy Side Sample

Description

This is a FIX initiator that connects to the pre-defined host and port. It will be accepted by dynamic acceptor.

Usage

  • Run the sample:
    • win: 2-AcceptedBuySide.bat
    • linux: 2-AcceptedBuySide.sh
  • Clean everything:
    • win: clean.bat
    • linux: clean.sh

Source Code

import biz.onixs.fix.dictionary.Version;
import biz.onixs.fix.engine.Engine;
import biz.onixs.fix.engine.Session;
import biz.onixs.fix.engine.SessionState;
import biz.onixs.fix.parser.Message;
import biz.onixs.fix.tag.FIX40;
import biz.onixs.fix.tag.FIX44;
import biz.onixs.util.TimestampFormat;
import biz.onixs.util.settings.PropertyBasedSettings;
import biz.onixs.util.settings.Settings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.Semaphore;

/**
 * FIX Initiator - Buy Side which will be accepted by dynamic acceptor.
 */
public class AcceptedBuySide implements Session.StateChangeListener, Session.InboundSessionMessageListener,
        Session.WarningListener, Session.ErrorListener, Runnable {
    private static final Logger LOG = LoggerFactory.getLogger(AcceptedBuySide.class);
    private static final String SETTINGS_RESOURCE = "sample/BuySide.properties";
    private final Semaphore sessionIsEstablished = new Semaphore(0);
    private Settings settings = null;
    private Version fixVersion = null;
    private Session session = null;

    public void run() {
        try {
            LOG.info("AcceptedBuySide");
            LOG.info("The application is starting...");
            //
            LOG.info("Loading settings from: {}", SETTINGS_RESOURCE);
            settings = new PropertyBasedSettings(SETTINGS_RESOURCE);
            //
            LOG.info("Starting the Engine...");
            final Engine engine = Engine.init(settings);
            //
            createSession();
            //
            establishConnection();
            //
            LOG.info("Waiting for session establishment...");
            sessionIsEstablished.acquire();
            //
            session.logout("The session is disconnected by AcceptedBuySide");
            session.dispose();
            //
            LOG.info("Engine shutdown...");
            engine.shutdown();
        } catch (final Exception e) {
            LOG.error(e.getMessage(), e);
        } finally {
            LOG.info("The application is stopped.");
        }
    }

    private void createSession() {
        fixVersion = Version.getByNumber(settings.getString("FIXVersion"));
        session = new Session("Accepted" + settings.getString("SenderCompID"),
                settings.getString("TargetCompID"), fixVersion,
                settings.getBoolean("keepSequenceNumbersBetweenFixConnections"));
        //
        session.setSenderSubID("SenderSubID (50) field")
                .setSendingTimeFormat(TimestampFormat.YYYYMMDDHHMMSSMsec)
                .setInboundSessionMessageListener(this)
                .addStateChangeListener(this)
                .setErrorListener(this)
                .setWarningListener(this);
    }

    private void establishConnection() {
        final String host = settings.getString("CounterpartyHost");
        final int port = settings.getInteger("CounterpartyPort");
        final Message logon = Message.create(FIX40.MsgType.Logon, fixVersion);
        logon.set(FIX44.Tag.Password, "CorrectPassword");
        LOG.info("Establishing connection to {}:{}...", host, port);
        session.logonAsInitiator(host, port, true, logon);
    }

    @Override
    public void onInboundSessionMessage(final Object sender, final Session.InboundSessionMessageArgs args) {
        final Message message = args.getMsg();
        LOG.info("Incoming session-level message: {}", message);
        // Processing of the incoming session-level message...
    }

    @Override
    public void onStateChange(final Object sender, final Session.StateChangeArgs args) {
        final SessionState newState = args.getNewState();
        final SessionState prevState = args.getPrevState();
        LOG.info("Session state changed from {} to {}", prevState, newState);
        if (SessionState.ESTABLISHED == newState) {
            sessionIsEstablished.release();
        }
    }

    @Override
    public void onError(final Object sender, final Session.ErrorArgs args) {
        LOG.error("{}", args);
    }

    @Override
    public void onWarning(final Object sender, final Session.WarningArgs args) {
        LOG.warn("{}", args);
    }

    public static void main(final String[] args) {
        (new AcceptedBuySide()).run();
    }
}

Rejected Buy Side Sample

Description

This is a FIX initiator that connects to the pre-defined host and port. It will be rejected by dynamic acceptor.

Usage

  • Run the sample:
    • win: 2-RejectedBuySide.bat
    • linux: 2-RejectedBuySide.sh
  • Clean everything:
    • win: clean.bat
    • linux: clean.sh

Source Code

import biz.onixs.fix.dictionary.Version;
import biz.onixs.fix.engine.Engine;
import biz.onixs.fix.engine.LinkErrorException;
import biz.onixs.fix.engine.Session;
import biz.onixs.fix.engine.SessionState;
import biz.onixs.fix.parser.Message;
import biz.onixs.fix.tag.FIX40;
import biz.onixs.fix.tag.FIX44;
import biz.onixs.util.TimestampFormat;
import biz.onixs.util.settings.PropertyBasedSettings;
import biz.onixs.util.settings.Settings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.Semaphore;

/**
 * FIX Initiator - Buy Side which will be rejected by dynamic acceptor.
 */
public class RejectedBuySide implements Session.StateChangeListener, Session.InboundSessionMessageListener, 
        Session.WarningListener, Session.ErrorListener, Runnable {
    private static final Logger LOG = LoggerFactory.getLogger(RejectedBuySide.class);
    private static final String SETTINGS_RESOURCE = "sample/BuySide.properties";
    private final Semaphore sessionIsDisconnected = new Semaphore(0);
    private Settings settings = null;
    private Version fixVersion = null;
    private Session session = null;

    public void run() {
        try {
            LOG.info("RejectedBuySide");
            LOG.info("The application is starting...");
            //
            LOG.info("Loading settings from: {}", SETTINGS_RESOURCE);
            settings = new PropertyBasedSettings(SETTINGS_RESOURCE);
            //
            LOG.info("Starting the Engine...");
            final Engine engine = Engine.init(settings);
            //
            createSession();
            //
            establishConnection();
            //
            LOG.info("Waiting for session establishment...");
            sessionIsDisconnected.acquire();
            //
            session.logout("The session is disconnected by RejectedBuySide");
            session.dispose();
            //
            LOG.info("Engine shutdown...");
            engine.shutdown();
        } catch (final Exception e) {
            LOG.error(e.getMessage(), e);
        } finally {
            LOG.info("The application is stopped.");
        }
    }

    private void createSession() {
        fixVersion = Version.getByNumber(settings.getString("FIXVersion"));
        session = new Session("Rejected" + settings.getString("SenderCompID"),
                settings.getString("TargetCompID"), fixVersion,
                settings.getBoolean("keepSequenceNumbersBetweenFixConnections"));
        //
        session.setSenderSubID("SenderSubID (50) field")
                .setSendingTimeFormat(TimestampFormat.YYYYMMDDHHMMSSMsec)
                .setInboundSessionMessageListener(this)
                .addStateChangeListener(this)
                .setErrorListener(this)
                .setWarningListener(this);
    }

    private void establishConnection() {
        final String host = settings.getString("CounterpartyHost");
        final int port = settings.getInteger("CounterpartyPort");
        final Message logon = Message.create(FIX40.MsgType.Logon, fixVersion);
        logon.set(FIX44.Tag.Password, "IncorrectPassword");
        LOG.info("Establishing connection to {}:{}...", host, port);
        try {
            session.logonAsInitiator(host, port, true, logon);
        } catch (final LinkErrorException e) {
            LOG.info("The logon rejected.");
        }
    }

    @Override
    public void onInboundSessionMessage(final Object sender, final Session.InboundSessionMessageArgs args) {
        final Message message = args.getMsg();
        LOG.info("Incoming session-level message: {}", message);
        // Processing of the incoming session-level message...
    }

    @Override
    public void onStateChange(final Object sender, final Session.StateChangeArgs args) {
        final SessionState newState = args.getNewState();
        final SessionState prevState = args.getPrevState();
        LOG.info("Session state changed from {} to {}", prevState, newState);
        if (SessionState.DISCONNECTED == newState) {
            sessionIsDisconnected.release();
        }
    }

    @Override
    public void onError(final Object sender, final Session.ErrorArgs args) {
        LOG.error("{}", args);
    }

    @Override
    public void onWarning(final Object sender, final Session.WarningArgs args) {
        LOG.warn("{}", args);
    }

    public static void main(final String[] args) {
        (new RejectedBuySide()).run();
    }
}