Samples :: FIXML Converter

Fixml Converter Sample

Description

This sample demonstrates how to convert FIX message to FIXML message and vice versa.

Directory Structure

Item Description
conf/sample sample data
conf/sample/schema FIXML schema documents
conf/logback.xml logger configuration

Usage

  • Run the sample:
    • Windows: FixmlConverterSample.bat
    • Linux: FixmlConverterSample.sh
  • Clean everything:
    • Windows: clean.bat
    • Linux: clean.sh

Source Code

import biz.onixs.fix.dictionary.Version;
import biz.onixs.fix.engine.Engine;
import biz.onixs.fix.fixml.FixmlConverter;
import biz.onixs.fix.parser.Message;
import biz.onixs.fix.fixml.Utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FixmlConverterSample {
    private static final Logger LOG = LoggerFactory.getLogger(FixmlConverterSample.class);

    public static void main(final String[] args) throws Exception {
        final Engine engine = Engine.init(-1);
        final FixmlConverter converter = new FixmlConverter(Version.FIX44);
        //
        final String inFixFile = "sample/Order.txt";
        LOG.info("Loading FIX message from file: {}", inFixFile);
        final Message inFixMessage = Utils.readFixMessage(inFixFile);
        LOG.info("Input FIX message: {}", inFixMessage);
        final String fixmlMessage = converter.fix2fixml(inFixMessage);
        LOG.info("Output converted FIXML message: {}", fixmlMessage);
        //
        final String inFixmlFile = "sample/ExecRpt.xml";
        LOG.info("Loading FIXML message from file: {}", inFixmlFile);
        final String inFixmlMessage = Utils.readFixmlMessage(inFixmlFile);
        LOG.info("Input FIXML message: {}", inFixmlMessage);
        final Message outFixMessage = converter.fixml2fix(fixmlMessage);
        LOG.info("Output converted FIX message: {}", outFixMessage);
        //
        engine.shutdown();
    }
}

Custom Repeating Group Sample

Description

This sample demonstrates how to convert FIX message to FIXML message. Customized FIXML schema is used.

Directory Structure

Item Description
conf/sample sample data
conf/sample/schema2 FIXML schema documents
conf/logback.xml logger configuration

Usage

  • Run the sample:
    • Windows: CustomRepeatingGroupSample.bat
    • Linux: CustomRepeatingGroupSample.sh
  • Clean everything:
    • Windows: clean.bat
    • Linux: clean.sh

Source Code

import biz.onixs.fix.dictionary.Version;
import biz.onixs.fix.engine.Engine;
import biz.onixs.fix.engine.EngineSettings;
import biz.onixs.fix.fixml.FixmlConverter;
import biz.onixs.fix.fixml.Utils;
import biz.onixs.fix.parser.Group;
import biz.onixs.fix.parser.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;

/**
 * Custom repeating group sample.
 *
 * Changes in the FIXML schemas are made in the following files:
 * conf/schema2/fixml-components-base-4-4.xsd
 * conf/schema2/fixml-fields-base-4-4.xsd
 *
 * Changes are surrounded with the "Sample changes" comment.
 */
public class CustomRepeatingGroupSample {
    private static final Logger LOG = LoggerFactory.getLogger(CustomRepeatingGroupSample.class);

    public static void main(final String[] args) throws Exception {
        final EngineSettings engineSettings = new EngineSettings()
                .setListenPorts("-1")
                .setDialects("sample/dialect.xml");
        Engine.init(engineSettings);
        //
        final File file = new File("conf/sample/schema2/fixml-main-4-4.xsd");
        final FixmlConverter converter = new FixmlConverter(file.toURI().toString(), Version.FIX44);
        // Adding custom repeating group
        converter.addCustomRepeatingGroup(10000, "CustomIdGrp_Block_t");
        //
        final String fixFile = "sample/Quot.txt";
        LOG.info("Loading FIX message from file: " + fixFile);
        final Message fixMessage = Utils.readFixMessage(fixFile);
        LOG.info("FIX message: {}", fixMessage);
        printRepeatingGroup711(fixMessage);
        final String fixmlMessage = converter.fix2fixml(fixMessage);
        LOG.info("Converted FIXML message: {}", fixmlMessage);
        //
        Engine.getInstance().shutdown();
    }

    private static void printRepeatingGroup711(final Message message) {
        final Group group711 = message.getGroup(711);
        if (null != group711) {
            LOG.info("Repeating group 711 instance number: {}", group711.getNumberOfInstances());
            for (int i = 0; i < group711.getNumberOfInstances(); i++) {
                LOG.info("  Repeating group 711, instance #{}", i);
                final Group group10000 = group711.getGroup(10000, i);
                if (null != group10000) {
                    for (int j = 0; j < group10000.getNumberOfInstances(); j++) {
                        LOG.info("    Repeating group 10000, instance #{}", j);
                        LOG.info("      Field 10001 value: {}", group10000.get(10001, j));
                    }
                } else {
                    LOG.info("  No repeating group 10000 defined");
                }
            }
        } else {
            LOG.info("No repeating group 711 defined");
        }
    }
}

Fixml Converter Benchmark Sample

Description

This sample benchmark conversion from FIX message to FIXML message.

Directory Structure

Item Description
conf/sample/FixmlMessageBenchmark.properties configuration file
conf/sample sample data
conf/sample/schema FIXML schema documents
conf/logback.xml logger configuration

Usage

  • Run the sample:
    • Windows: FixmlConverterBenchmarkSample.bat
    • Linux: FixmlConverterBenchmarkSample.sh
  • Clean everything:
    • Windows: clean.bat
    • Linux: clean.sh

Source Code

import biz.onixs.fix.engine.Engine;
import biz.onixs.fix.parser.Message;
import biz.onixs.util.PrecisionTimer;
import biz.onixs.util.settings.PropertyBasedSettings;
import biz.onixs.util.url.ResourceLoader;
import biz.onixs.util.url.ResourceLoaderUtil;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.InputStream;
import java.nio.charset.Charset;

public class FixmlBenchmark {
    private static final Logger LOG = LoggerFactory.getLogger(FixmlBenchmark.class);
    private static final ResourceLoader resourceLoader = ResourceLoaderUtil.DEFAULT_LOADER;
    private final PropertyBasedSettings settings = new PropertyBasedSettings("sample/FixmlMessageBenchmark.properties");

    private void run() {
        try {
            Engine.init(settings);
            final long messageNum = settings.getLong("MessageNum");
            final String messageFile = settings.getString("MessageFile");
            final InputStream inputStream = resourceLoader.getResource(messageFile);
            final String rawMsg = IOUtils.toString(inputStream, Charset.defaultCharset()).trim();
            final Message fixMsg = new Message(rawMsg);
            LOG.info("Raw message size: {} bytes", rawMsg.length());
            doBenchmark(fixMsg, messageNum);
        } catch (final Exception e) {
            LOG.error(e.getMessage(), e);
        } finally {
            if (Engine.isInited()) {
                LOG.info("Engine shutdown...");
                Engine.getInstance().shutdown();
            }
        }
    }

    private static void doBenchmark(final Message message, final long messageNum) {
        final Benchmark benchmark = new Benchmark(message);
        benchmark.setMessageNum(messageNum);
        LOG.info(Benchmark.getName());
        benchmark.warmUp();
        final PrecisionTimer timer = new PrecisionTimer();
        benchmark.run();
        timer.stop();
        LOG.info("Performance: {} msgs/sec", timer.getItemsPerSecond(benchmark.getMessageNum()));
    }

    public static void main(final String[] args) {
        LOG.info("Fixml message Benchmark");
        LOG.info("The application is starting...");
        final FixmlBenchmark messageBenchmark = new FixmlBenchmark();
        messageBenchmark.run();
    }
}

The following class is used in the sample:

import biz.onixs.fix.dictionary.Version;
import biz.onixs.fix.fixml.FixmlConverter;
import biz.onixs.fix.parser.Message;
import biz.onixs.fix.fixml.FixmlConverterException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Benchmark {
    private static final Logger LOG = LoggerFactory.getLogger(Benchmark.class);
    private final Message message;
    private FixmlConverter converter = null;
    private long messageNum = 0L;

    Benchmark(final Message message) {
        this.message = message;
        try {
            converter = new FixmlConverter(Version.FIX44);
        } catch (final Exception e) {
            LOG.error("Can't initialize Fixml Converter");
        }
    }

    public long getMessageNum() {
        return messageNum;
    }

    public void setMessageNum(final long messageNum) {
        this.messageNum = messageNum;
    }

    public static String getName() {
        return "Message converted from FIX to FIXML";
    }

    void warmUp() {
        LOG.info("Running warm-up...");
        cycle(messageNum / 10L);
    }

    void run() {
        LOG.info("Running benchmark...");
        cycle(messageNum);
    }

    private void cycle(final long messageNum) {
        LOG.info("Message number: {}", messageNum);
        try {
            for (long l = 0L; l < messageNum; l++) {
                doAction();
            }
        } catch (final FixmlConverterException e) {
            LOG.error("Can't convert FIX to FIXML");
        }
    }

    private void doAction() throws FixmlConverterException {
        converter.fix2fixml(message);
    }
}