image/svg+xml
  • OnixS .NET FIX Engine
  • Programming Guide
  • Api Documentation
  • Version 1.16.0
    • Programming Guide
Show / Hide Table of Contents
  • Introduction
  • System Requirements
  • Project Dependency Management
  • Getting Started
  • Error Reporting
  • Licensing
  • Engine Initialization and Shutdown
  • Selecting FIX Version
  • FIX Message
    • Manipulating Message Fields
  • FIX Session
    • Establishing FIX Connection
    • Exchanging Messages
    • Message Sequence Numbers
  • Configuring the Engine
    • Loading Engine Settings From Configuration Files
    • Multiple Listen Ports
  • Logging Services
    • Selecting Session Storage
    • Customizing Message Logging
  • Threading Model
  • Thread Safety
  • Repeating Groups
  • Sessions
    • Session States
    • Session Events
    • Accepting FIX Session Without a Prior Creation of Session Object
    • Custom Logon Message
    • Logon Authentication
    • Establishing FIX Connection via Proxy
    • Resetting Message Sequence Numbers
    • Resetting Message Sequence Numbers via ResetSeqNumFlag Field
    • Resending Messages
    • Memory-based Session Storage
    • File-based Session Storage
    • Async File-based Session Storage
    • Pluggable Session Storage
    • Scheduling Session for Automatic Connection
      • Session Schedule
      • Session Connection Settings
      • XML-based Schedules and Connection Settings
    • Failover
    • Message Sending Latency
    • Message Receiving Latency
    • Message Throttling
  • Messaging
    • Manipulating Real Numbers
    • Message Validation
    • Serialized FIX Messages
    • Typed FIX Messages
    • Flat Messages
      • Flat Group Reader
    • Using LINQ
  • FIX Dictionary
    • XML-based Dictionary Description
    • Session-level Dictionary
    • Dictionary Exploration
    • Using QuickFIX Data Dictionary
  • Engine Events
  • TLS/SSL Encryption
    • Using TLS/SSL Encryption
    • Supported Certificates
    • Session-level TLS/SSL Settings
    • Verification of Client SSL Certificates
    • Custom verification of SSL Certificates
    • TLS/SSL Troubleshooting
  • FAST Coding
    • Encoding And Decoding Data Using FAST
    • FAST Template
    • Generating FIX Dictionaries For FAST Coding
    • FAST Exceptions
  • FIXML Converter
  • Reducing Garbage Collection Overhead
  • Best Practices
    • Low Latency Best Practices
    • High Throughput Best Practices
  • Migration Guide
  • Frequently Asked Questions
  • Glossary
  • External Resources
  • Samples
  • Support

Scheduler For Buy Side Windows Service Sample Project

This sample illustrates how to run BuySide Fix session under Scheduler as a hosted service.

Please pay attention that a Windows service app returns the C:\WINDOWS\system32 folder as its current directory, so absolute paths for EngineSettings.LicenseStore, EngineSettings.StorageDirectory and EngineSettings.Dictionary should be used.

© Onix Solutions

Source code


using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using NLog.Extensions.Logging;
using OnixS.Fix;
using OnixS.Fix.Scheduling;
#if NET5_0_OR_GREATER
using System.Runtime.Versioning;
#endif

namespace SchedulerForBuySideWindowsService
{

#if NET5_0_OR_GREATER
    [SupportedOSPlatform("windows")]
#endif
    public class SchedulerForBuySideService : BackgroundService
    {
        Scheduler scheduler;
        Session initiator;

        static void ReportEvent(string msg)
        {
            Console.WriteLine("SchedulerForBuySideServiceSample: " +  msg);
        }

        public override Task StartAsync(CancellationToken cancellationToken)
        {
            if (!cancellationToken.IsCancellationRequested)
            {
                try
                {
                    EngineSettings settings = new()
                    {
                        StorageDirectory = Path.Join(AppDomain.CurrentDomain.BaseDirectory, "MsgStorage"),
                        LicenseStore = AppDomain.CurrentDomain.BaseDirectory,
                        LoggerProvider = new NLogLoggerProvider()
                    };

                    Engine.Init(settings);

                    const string SenderCompID = "BuySide";
                    const string TargetCompID = "SellSide";

                    initiator = new Session(SenderCompID, TargetCompID, ProtocolVersion.Fix44, true, SessionStorageType.FileBasedStorage);

                    initiator.Error += (_, args) => {ReportEvent("Session Error: " + args); };

                    initiator.Warning += (_, args) => { ReportEvent("Session Warning: " + args ); };

                    initiator.StateChanged += (_, e) => { ReportEvent("New session state: " + e.NewState); };

                    SessionSchedule schedule =
                        new(
                            DayOfWeek.Sunday,
                            DayOfWeek.Saturday,
                            new TimeSpan(0, 0, 0),
                            new TimeSpan(23, 59, 59),
                            SessionDuration.Day,
                            SequenceNumberResetPolicy.Never);


                    scheduler = new Scheduler();

                    scheduler.Error += (_, args) => {
                        ReportEvent($"Scheduler reported error for session {args.Session}: {args.Reason}");
                    };

                    scheduler.Register(initiator, schedule, new InitiatorConnectionSettings("localhost", 10450, true));
                }
                catch (Exception ex)
                {
                    ReportEvent(ex.ToString());
                }
            }
            return base.StartAsync(cancellationToken);
        }

        public override Task StopAsync(CancellationToken cancellationToken)
        {
            try
            {
                scheduler.Unregister(initiator);

                if (initiator != null)
                {
                    initiator.Dispose();
                    initiator = null;
                }

                if (scheduler != null)
                {
                    scheduler.Dispose();
                    scheduler = null;
                }

                if (Engine.IsInitialized)
                    Engine.Shutdown();
            }
            catch (Exception ex)
            {
                ReportEvent(ex.ToString());
            }
            return base.StopAsync(cancellationToken);
        }

        protected override Task ExecuteAsync(CancellationToken stoppingToken)
        {
            return Task.CompletedTask;
        }
    }
}

Host Run


using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
#if NET5_0_OR_GREATER
using System.Runtime.Versioning;
#endif

namespace SchedulerForBuySideWindowsService
{
#if NET5_0_OR_GREATER
    [SupportedOSPlatform("windows")]
#endif
    internal static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main(string[] args)
        {
            using IHost host = Host.CreateDefaultBuilder(args)
                .UseWindowsService(options =>
                {
                    options.ServiceName = ".NET Scheduler For BuySide Service";
                })
                .ConfigureServices(services =>
                {
                    services.AddHostedService<SchedulerForBuySideService>();
                })
                .Build();

            host.RunAsync().Wait();
        }
    }
}

In this article
  • Source code
  • Host Run
Back to top Copyright © Onix Solutions.
Generated by DocFX