io.allune:quickfixj-spring-boot-starter

Spring Boot Starter for QuickFIX/J


Keywords
financial, fixprotocol, java, quickfixj, spring, spring-boot, spring-boot-actuator, spring-boot-starter
License
Apache-2.0

Documentation

CircleCI codecov Maven Central Apache 2 QuickFIX/J 2.3.1 Codacy code quality OpenSSF Scorecard

Spring Boot Starter for QuickFIX/J (Spring Boot 2 and Spring Boot 3)

This project is a Spring Boot Starter for QuickFIX/J messaging engine for the FIX protocol. It simplifies the configuration required to create and start an Initiator or Acceptor, and handles the lifecycle of the Connector.

Compatibility with version 3.2 onwards

If you use Spring Boot 3.2 or greater you will need to use version 2.17.0 or greater of the Spring Boot Starter for QuickFIX/J as it fixes an issue with Parameter Name Discovery

Getting started

To use the QuickFIX/J Server or QuickFIX/J Client you need to add the QuickFIX/J Spring Boot Starter dependency in your project.

<dependency>
    <groupId>io.allune</groupId>
    <artifactId>quickfixj-spring-boot-starter</artifactId>
    <version>2.17.1</version>
</dependency>

QuickFIX/J Spring Boot Starter - Server (Acceptor)

There are two options to configure a QuickFIX/J Server.

EnableQuickFixJServer annotation

Adding the @EnableQuickFixJServer annotation in your project will configure an Acceptor with all the default QuickFix/J components:

  • A MessageStoreFactory of type MemoryStoreFactory.

  • A LogFactory of type ScreenLogFactory.

  • An Acceptor of type SocketAcceptor.

  • An Application of type EventPublisherApplicationAdapter.

All these QuickFix/J components can be configured via properties or by overriding the beans. If you choose to provide your own implementation for any of these components, you need to specify spring.main.allow-bean-definition-overriding=true. This annotation will be deprecated in future releases.

For example:

@EnableQuickFixJServer
@SpringBootApplication
public class AppServer {

    public static void main(String[] args) {
        SpringApplication.run(AppServer.class, args);
    }

    @Bean
    public Application serverApplication() {
        return new ServerApplicationAdapter(); // Provide your own implementation here
    }

    @Bean
    public Acceptor severAcceptor(
            Application serverApplication,
            MessageStoreFactory serverMessageStoreFactory,
            SessionSettings serverSessionSettings,
            LogFactory serverLogFactory,
            MessageFactory serverMessageFactory
    ) throws ConfigError {
        return new ThreadedSocketAcceptor(serverApplication, serverMessageStoreFactory, serverSessionSettings,
                serverLogFactory, serverMessageFactory);
    }

    @Bean
    public LogFactory serverLogFactory(SessionSettings serverSessionSettings) {
        return new FileLogFactory(serverSessionSettings);
    }
}

Enabling QuickFix/J Server through a property

Enabling the autoconfiguration of QuickFix/J Server can be done through a property. It autoconfigures an Acceptor with all the same default QuickFix/J components as @EnableQuickFixJServer.

property example description

quickfixj.server.enabled

true

Enables QuickFix/J Server autoconfiguration.

Configuring the QuickFix/J Server

Additionally, you need to follow the configuration guide to configure the FIX sessions. The configuration is resolved using the following approach:

  • By a QuickFIX/J configuration string defined by the quickfixj.server.configString property

  • By the presence of a quickfix.SessionSettings bean named serverSessionSettings

  • By a configuration file defined by the quickfixj.server.config property

  • By the presence of the quickfixj.server.config system property

  • By a quickfixj-server.cfg in the working directory or at the root of the classpath

QuickFIX/J Server properties

Property Example Description

quickfixj.server.config

classpath:quickfixj-server.cfg

Location of the QuickFix/J configuration file.

quickfixj.server.configString

[default] \r\n... (see below for an example)

The content of the QuickFIX/J configuration file. This property takes precedence over quickfixj.server.config.

quickfixj.server.auto-startup

true

Whether to autostart the connection manager at start up (default: true).

quickfixj.server.force-disconnect

false

Whether logged on sessions should be disconnected forcibly when the connector is stopped (default: false).

quickfixj.server.phase

0

Phase in which this connection manager should be started and stopped (default: Integer.MAX_VALUE).

quickfixj.server.jmx-enabled

true

Whether to register the jmx mbeans for the acceptor (default: false).

quickfixj.server.message-store-factory

memory

Type of MessageStoreFactory to create. Supported values: cachedfile, file, jdbc, memory, noop, sleepycat (default: memory).

quickfixj.server.log-factory

screen

Type of LogFactory to create. Supported values: compositelog, file, jdbc, slf4j, screen (default: screen).

quickfixj.server.concurrent.enabled

true

Whether to use a simple SocketAcceptor or a ThreadedSocketAcceptor (default: false - uses SocketAcceptor).

quickfixj.server.concurrent.useDefaultExecutorFactory

true

Whether to use a default ExecutorFactory to create the Acceptor (default: false).

quickfixj.server.concurrent.queueCapacity

Integer.MAX_VALUE

When using the default ExecutorFactory, the Executor’s queue capacity (default: Integer.MAX_VALUE).

quickfixj.server.concurrent.corePoolSize

8

When using the default ExecutorFactory, the Executor’s core pool size (default: 8).

quickfixj.server.concurrent.maxPoolSize

Integer.MAX_VALUE

When using the default ExecutorFactory, the Executor’s max pool size (default: Integer.MAX_VALUE).

quickfixj.server.concurrent.allowCoreThreadTimeOut

true

When using the default ExecutorFactory, whether to allow core thread timeout on the Executor (default: true).

quickfixj.server.concurrent.keepAliveSeconds

60

When using the default ExecutorFactory, the Executor’s keep alive in seconds (default: 60).

quickfixj.server.concurrent.waitForTasksToCompleteOnShutdown

false

When using the default ExecutorFactory, whether to wait for tasks to complete on shutdown on the Executor (default: false).

quickfixj.server.concurrent.awaitTerminationSeconds

0

When using the default ExecutorFactory, the Executor’s await termination in seconds (default: 0).

quickfixj.server.concurrent.threadNamePrefix

QuickFixJ Spring Boot Starter thread-

When using the default ExecutorFactory, the Executor’s thread name prefix (default: QuickFixJ Spring Boot Starter thread-).

For example:

quickfixj.server.config=classpath:quickfixj-server.cfg
quickfixj.server.configString=[default]  \r\n\... (see below for an example)
quickfixj.server.auto-startup=true
quickfixj.server.force-disconnect=false
quickfixj.server.phase=0
quickfixj.server.jmx-enabled=true
quickfixj.server.message-store-factory=memory
quickfixj.server.log-factory=screen

quickfixj.server.concurrent.enabled=true
quickfixj.server.concurrent.useDefaultExecutorFactory=true
quickfixj.server.concurrent.queueCapacity=Integer.MAX_VALUE
quickfixj.server.concurrent.corePoolSize=8
quickfixj.server.concurrent.maxPoolSize=Integer.MAX_VALUE
quickfixj.server.concurrent.allowCoreThreadTimeOut=true
quickfixj.server.concurrent.keepAliveSeconds=60
quickfixj.server.concurrent.waitForTasksToCompleteOnShutdown=false
quickfixj.server.concurrent.awaitTerminationSeconds=0
quickfixj.server.concurrent.threadNamePrefix="QuickFixJ Spring Boot Starter thread-"
quickfixj:
  server:
    config: classpath:quickfixj-server.cfg
    auto-startup: true
    force-disconnect: false
    phase: 0
    jmx-enabled: true
    concurrent:
      enabled: true
      useDefaultExecutorFactory: true
      queueCapacity: Integer.MAX_VALUE
      corePoolSize: 8
      maxPoolSize: Integer.MAX_VALUE
      allowCoreThreadTimeOut: true
      keepAliveSeconds: 60
      waitForTasksToCompleteOnShutdown: false
      awaitTerminationMillis: 0
      threadNamePrefix: "QuickFixJ Spring Boot Starter thread-"
    message-store-factory: memory
    log-factory: screen

QuickFIX/J configuration file in properties and yaml files

Using the quickfixj.server.configString property:

quickfixj.server.configString=[default]  \r\n\
                              FileStorePath=target/data/executor  \r\n\
                              ConnectionType=acceptor  \r\n\
                              StartTime=00:00:00  \r\n\
                              EndTime=00:00:00  \r\n\
                              HeartBtInt=30  \r\n\
                              ValidOrderTypes=1,2,F  \r\n\
                              SenderCompID=EXEC  \r\n\
                              TargetCompID=BANZAI  \r\n\
                              UseDataDictionary=Y  \r\n\
                              DefaultMarketPrice=12.30  \r\n\
                              FileLogPath=logs-server  \r\n\
                              \r\n\
                              [session]  \r\n\
                              BeginString=FIX.4.0  \r\n\
                              SocketAcceptPort=9876  \r\n\
                              \r\n\
                              [session]  \r\n\
                              BeginString=FIX.4.1  \r\n\
                              SocketAcceptPort=9877  \r\n\
                              \r\n\
                              [session]  \r\n\
                              BeginString=FIX.4.2  \r\n\
                              SocketAcceptPort=9878  \r\n\
                              \r\n\
                              [session]  \r\n\
                              BeginString=FIX.4.3  \r\n\
                              SocketAcceptPort=9879  \r\n\
                              \r\n\
                              [session]  \r\n\
                              BeginString=FIX.4.4  \r\n\
                              SocketAcceptPort=9880  \r\n\
                              \r\n\
                              [session]  \r\n\
                              BeginString=FIXT.1.1  \r\n\
                              DefaultApplVerID=FIX.5.0SP2  \r\n\
                              SocketAcceptPort=9881
quickfixj:
  server:
    configString: |
      [default]
      FileStorePath=target/data/executor
      ConnectionType=acceptor
      StartTime=00:00:00
      EndTime=00:00:00
      HeartBtInt=30
      ValidOrderTypes=1,2,F
      SenderCompID=EXEC
      TargetCompID=BANZAI
      UseDataDictionary=Y
      DefaultMarketPrice=12.30
      FileLogPath=logs-server

      [session]
      BeginString=FIX.4.0
      SocketAcceptPort=9876

      [session]
      BeginString=FIX.4.1
      SocketAcceptPort=9877

      [session]
      BeginString=FIX.4.2
      SocketAcceptPort=9878

      [session]
      BeginString=FIX.4.3
      SocketAcceptPort=9879

      [session]
      BeginString=FIX.4.4
      SocketAcceptPort=9880

      [session]
      BeginString=FIXT.1.1
      DefaultApplVerID=FIX.5.0SP2
      SocketAcceptPort=9881

QuickFIX/J Server Actuator

To enable the actuator endpoints you will also have to add the QuickFIX/J Spring Boot Actuator dependency.

<dependency>
    <groupId>io.allune</groupId>
    <artifactId>quickfixj-spring-boot-actuator</artifactId>
    <version>2.17.1</version>
</dependency>

Enabling the autoconfiguration of QuickFix/J Server Actuator can be done through a property.

property example description

quickfixj.server.actuator.enabled

true

Enables QuickFix/J Server Actuator autoconfiguration.

Please note that the quickfixj-spring-boot-actuator dependency will be added automatically by quickfixj-spring-boot-starter

And enable the QuickFix/J Server endpoint in Spring:

management.endpoint.quickfixjserver.enabled=true # whether the endpoint is enabled or not
management.endpoints.web.exposure.include=quickfixjserver # whether the endpoint will be exposed
management:
  endpoint:
    health:
      show-details: always
    quickfixjserver:
      enabled: true
  endpoints:
    web:
      exposure:
        include: quickfixjserver

Example usage:

http://localhost:8081/actuator/quickfixjserver
{
  "FIX.4.2:EXEC->BANZAI": {
    "SenderCompID": "EXEC",
    "StartTime": "00:00:00",
    "DefaultMarketPrice": "12.30",
    "ValidOrderTypes": "1,2,F",
    "ConnectionType": "acceptor",
    "EndTime": "00:00:00",
    "BeginString": "FIX.4.2",
    "SocketAcceptPort": "9878",
    "TargetCompID": "BANZAI",
    "SenderCompID": "EXEC",
    "HeartBtInt": "30",
    "BeginString": "FIX.4.2",
    "TargetCompID": "BANZAI",
    "FileStorePath": "target/data/executor",
    "UseDataDictionary": "Y",
    "ProxyPassword": "******"
  },
  "FIX.4.1:EXEC->BANZAI": {
    "SenderCompID": "EXEC",
    "StartTime": "00:00:00",
    "DefaultMarketPrice": "12.30",
    "ValidOrderTypes": "1,2,F",
    "ConnectionType": "acceptor",
    "EndTime": "00:00:00",
    "BeginString": "FIX.4.1",
    "SocketAcceptPort": "9877",
    "TargetCompID": "BANZAI",
    "SenderCompID": "EXEC",
    "HeartBtInt": "30",
    "BeginString": "FIX.4.1",
    "TargetCompID": "BANZAI",
    "FileStorePath": "target/data/executor",
    "UseDataDictionary": "Y",
	"JdbcPassword": "******"
  }
}

QuickFIX/J Server Health Endpoint

The QuickFIX/J Spring Boot Starter provides with a HealthIndicator that checks if the sessions are logged on when they should be (i.e. within market hours) and shows the expected schedule for each session. For example:

"quickfixjServerSession": {
    "status": "DOWN",
    "details": {
        "FIXT.1.1:BANZAI->EXEC1": "LoggedOn",
        "sessionSchedule": "monday, tuesday, wednesday, thursday, friday, saturday, sunday, 04:00:00-UTC - 03:59:59-UTC (monday, tuesday, wednesday, thursday, friday, saturday, sunday, 00:00:00-EDT - 23:59:59-EDT)",
        "FIXT.1.1:BANZAI->EXEC2": "LoggedOff",
    }
}

The HealthIndicator can be enabled in Spring as follows:

management.health.quickfixjserver.enabled=true
management:
  health:
    quickfixjserver:
      enabled: true

QuickFIX/J Spring Boot Starter - Client (Initiator)

There are two options to configure a QuickFIX/J Client.

EnableQuickFixJClient annotation

Adding the @EnableQuickFixJClient annotation in your project will configure an Initiator with all the default QuickFix/J components:

  • A MessageStoreFactory of type MemoryStoreFactory.

  • A LogFactory of type ScreenLogFactory.

  • An Initiator of type SocketInitiator.

  • An Application of type EventPublisherApplicationAdapter.

All these QuickFix/J components can be configured via properties or by overriding the beans. If you choose to provide your own implementation for any of these components, you need to specify spring.main.allow-bean-definition-overriding=true. This annotation will be deprecated in future releases.

For example:

@EnableQuickFixJClient
@SpringBootApplication
public class AppClient {

    public static void main(String[] args) {
        SpringApplication.run(AppClient.class, args);
    }

    @Bean
    public Application clientApplication() {
        return new ClientApplicationAdapter(); // Provide your own implementation here
    }

    @Bean
    public Initiator clientInitiator(
            Application clientApplication,
            MessageStoreFactory clientMessageStoreFactory,
            SessionSettings clientSessionSettings,
            LogFactory clientLogFactory,
            MessageFactory clientMessageFactory
    ) throws ConfigError {
        return new ThreadedSocketInitiator(clientApplication, clientMessageStoreFactory, clientSessionSettings,
                clientLogFactory, clientMessageFactory);
    }

    @Bean
    public LogFactory clientLogFactory(SessionSettings clientSessionSettings) {
        return new FileLogFactory(clientSessionSettings);
    }
}

Enabling QuickFix/J Client through a property

Enabling the autoconfiguration of QuickFix/J Client can be done through a property. It autoconfigures an Initiator with all the same default QuickFix/J components as @EnableQuickFixJClient.

property example description

quickfixj.client.enabled

true

Enables QuickFix/J Client autoconfiguration.

Configuring the QuickFix/J Client

Additionally you need to follow the configuration guide to configure the FIX sessions. The configuration is resolved using the following approach:

  • By a QuickFIX/J configuration string defined by the quickfixj.client.configString property

  • By the presence of a quickfix.SessionSettings bean named clientSessionSettings

  • By a configuration file defined by the quickfixj.client.config property

  • By the presence of the quickfixj.client.config system property

  • By a quickfixj-client.cfg in the working directory or at the root of the classpath

QuickFIX/J Client properties

Property Example Description

quickfixj.client.config

classpath:quickfixj-client.cfg

Location of the QuickFix/J configuration file.

quickfixj.client.configString

[default] \r\n... (see below for an example)

The content of the QuickFIX/J configuration file. This property takes precedence over quickfixj.client.config.

quickfixj.client.auto-startup

true

Whether to autostart the connection manager at start up (default: true).

quickfixj.client.phase

0

Phase in which this connection manager should be started and stopped (default: Integer.MAX_VALUE).

quickfixj.client.jmx-enabled

true

Whether to register the jmx mbeans for the initiator (default: false).

quickfixj.client.message-store-factory

memory

Type of MessageStoreFactory to create. Supported values: cachedfile, file, jdbc, memory, noop, sleepycat (default: memory).

quickfixj.client.log-factory

screen

Type of LogFactory to create. Supported values: compositelog, file, jdbc, slf4j, screen (default: screen).

quickfixj.client.concurrent.enabled

true

Whether to use a simple SocketInitiator or a ThreadedSocketInitiator (default: false - uses SocketInitiator).

quickfixj.client.concurrent.useDefaultExecutorFactory

true

Whether to use a default ExecutorFactory to create the Initiator (default: false).

quickfixj.client.concurrent.queueCapacity

Integer.MAX_VALUE

When using the default ExecutorFactory, the Executor’s queue capacity (default: Integer.MAX_VALUE).

quickfixj.client.concurrent.corePoolSize

8

When using the default ExecutorFactory, the Executor’s core pool size (default: 8).

quickfixj.client.concurrent.maxPoolSize

Integer.MAX_VALUE

When using the default ExecutorFactory, the Executor’s max pool size (default: Integer.MAX_VALUE).

quickfixj.client.concurrent.allowCoreThreadTimeOut

true

When using the default ExecutorFactory, whether to allow core thread timeout on the Executor (default: true).

quickfixj.client.concurrent.keepAliveSeconds

60

When using the default ExecutorFactory, the Executor’s keep alive in seconds (default: 60).

quickfixj.client.concurrent.waitForTasksToCompleteOnShutdown

false

When using the default ExecutorFactory, whether to wait for tasks to complete on shutdown on the Executor (default: false).

quickfixj.client.concurrent.awaitTerminationSeconds

0

When using the default ExecutorFactory, the Executor’s await termination in seconds (default: 0).

quickfixj.client.concurrent.threadNamePrefix

QuickFixJ Spring Boot Starter thread-

When using the default ExecutorFactory, the Executor’s thread name prefix (default: QuickFixJ Spring Boot Starter thread-).

For example:

quickfixj.client.config=classpath:quickfixj-client.cfg
quickfixj.client.configString=[default]  \r\n\... (see below for an example)
quickfixj.client.auto-startup=true
quickfixj.client.phase=0
quickfixj.client.jmx-enabled=true
quickfixj.client.message-store-factory=memory
quickfixj.client.log-factory=screen

quickfixj.client.concurrent.enabled=true
quickfixj.client.concurrent.useDefaultExecutorFactory=true
quickfixj.client.concurrent.queueCapacity=Integer.MAX_VALUE
quickfixj.client.concurrent.corePoolSize=8
quickfixj.client.concurrent.maxPoolSize=Integer.MAX_VALUE
quickfixj.client.concurrent.allowCoreThreadTimeOut=true
quickfixj.client.concurrent.keepAliveSeconds=60
quickfixj.client.concurrent.waitForTasksToCompleteOnShutdown=false
quickfixj.client.concurrent.awaitTerminationSeconds=0
quickfixj.client.concurrent.threadNamePrefix="QuickFixJ Spring Boot Starter thread-"
quickfixj:
  client:
    config: classpath:quickfixj-client.cfg
    auto-startup: true
    force-disconnect: false
    phase: 0
    jmx-enabled: true
    concurrent:
      enabled: true
      useDefaultExecutorFactory: true
      queueCapacity: Integer.MAX_VALUE
      corePoolSize: 8
      maxPoolSize: Integer.MAX_VALUE
      allowCoreThreadTimeOut: true
      keepAliveSeconds: 60
      waitForTasksToCompleteOnShutdown: false
      awaitTerminationMillis: 0
      threadNamePrefix: "QuickFixJ Spring Boot Starter thread-"
    message-store-factory: memory
    log-factory: screen

QuickFIX/J configuration file in properties and yaml files

Using the quickfixj.client.configString property:

quickfixj.client.configString=[default] \r\n\
                              FileStorePath=target/data/banzai \r\n\
                              ConnectionType=initiator \r\n\
                              SenderCompID=BANZAI \r\n\
                              TargetCompID=EXEC \r\n\
                              SocketConnectHost=localhost \r\n\
                              StartTime=00:00:00 \r\n\
                              EndTime=00:00:00 \r\n\
                              HeartBtInt=30 \r\n\
                              ReconnectInterval=5 \r\n\
                              FileLogPath=logs-client \r\n\
                              \r\n\
                              [session] \r\n\
                              BeginString=FIX.4.0 \r\n\
                              SocketConnectPort=9876 \r\n\
                              \r\n\
                              [session] \r\n\
                              BeginString=FIX.4.1 \r\n\
                              SocketConnectPort=9877 \r\n\
                              \r\n\
                              [session] \r\n\
                              BeginString=FIX.4.2 \r\n\
                              SocketConnectPort=9878 \r\n\
                              \r\n\
                              [session] \r\n\
                              BeginString=FIX.4.3 \r\n\
                              SocketConnectPort=9879 \r\n\
                              \r\n\
                              [session] \r\n\
                              BeginString=FIX.4.4 \r\n\
                              SocketConnectPort=9880 \r\n\
                              \r\n\
                              [session] \r\n\
                              BeginString=FIXT.1.1 \r\n\
                              DefaultApplVerID=FIX.5.0SP2 \r\n\
                              SocketConnectPort=9881
quickfixj:
  client:
    configString: |
      [default]
      FileStorePath=target/data/banzai
      ConnectionType=initiator
      SenderCompID=BANZAI
      TargetCompID=EXEC
      SocketConnectHost=localhost
      StartTime=00:00:00
      EndTime=00:00:00
      HeartBtInt=30
      ReconnectInterval=5
      FileLogPath=logs-client

      [session]
      BeginString=FIX.4.0
      SocketConnectPort=9876

      [session]
      BeginString=FIX.4.1
      SocketConnectPort=9877

      [session]
      BeginString=FIX.4.2
      SocketConnectPort=9878

      [session]
      BeginString=FIX.4.3
      SocketConnectPort=9879

      [session]
      BeginString=FIX.4.4
      SocketConnectPort=9880

      [session]
      BeginString=FIXT.1.1
      DefaultApplVerID=FIX.5.0SP2
      SocketConnectPort=9881

QuickFIX/J Client Actuator

To enable the actuator endpoints you will also have to add the QuickFIX/J Spring Boot Actuator dependency.

<dependency>
    <groupId>io.allune</groupId>
    <artifactId>quickfixj-spring-boot-actuator</artifactId>
    <version>2.17.1</version>
</dependency>

Enabling the autoconfiguration of QuickFix/J Client Actuator can be done through a property.

property example description

quickfixj.client.actuator.enabled

true

Enables QuickFix/J Client Actuator autoconfiguration.

Please note that the quickfixj-spring-boot-actuator dependency will be added automatically by quickfixj-spring-boot-starter

And enable the QuickFix/J Client endpoint in Spring:

management.endpoint.quickfixjclient.enabled=true # whether the endpoint is enabled or not
management.endpoints.web.exposure.include=quickfixjclient # whether the endpoint will be exposed
management:
  endpoint:
    health:
      show-details: always
    quickfixjclient:
      enabled: true
  endpoints:
    web:
      exposure:
        include: quickfixjclient

Example usage:

http://localhost:8081/actuator/quickfixjclient
{
  "FIXT.1.1:BANZAI->EXEC": {
    "SenderCompID": "BANZAI",
    "StartTime": "00:00:00",
    "ConnectionType": "initiator",
    "EndTime": "00:00:00",
    "BeginString": "FIXT.1.1",
    "ReconnectInterval": "5",
    "TargetCompID": "EXEC",
    "DefaultApplVerID": "FIX.5.0",
    "SocketConnectHost": "localhost",
    "SenderCompID": "BANZAI",
    "HeartBtInt": "30",
    "BeginString": "FIXT.1.1",
    "TargetCompID": "EXEC",
    "FileStorePath": "target/data/banzai",
    "SocketConnectPort": "9881",
    "ProxyPassword": "******"
  },
  "FIX.4.2:BANZAI->EXEC": {
    "SenderCompID": "BANZAI",
    "StartTime": "00:00:00",
    "ConnectionType": "initiator",
    "EndTime": "00:00:00",
    "BeginString": "FIX.4.2",
    "ReconnectInterval": "5",
    "TargetCompID": "EXEC",
    "SocketConnectHost": "localhost",
    "SenderCompID": "BANZAI",
    "HeartBtInt": "30",
    "BeginString": "FIX.4.2",
    "TargetCompID": "EXEC",
    "FileStorePath": "target/data/banzai",
    "SocketConnectPort": "9878",
	"JdbcPassword": "******"
  }
}

QuickFIX/J Client Health Endpoint

The QuickFIX/J Spring Boot Starter provides with a HealthIndicator that checks if the sessions are logged on when they should be (i.e. within market hours) and shows the expected schedule for each session. For example:

"quickfixjClientSession": {
    "status": "DOWN",
    "details": {
        "FIXT.1.1:BANZAI->EXEC1": "LoggedOn",
        "sessionSchedule": "monday, tuesday, wednesday, thursday, friday, saturday, sunday, 04:00:00-UTC - 03:59:59-UTC (monday, tuesday, wednesday, thursday, friday, saturday, sunday, 00:00:00-EDT - 23:59:59-EDT)",
        "FIXT.1.1:BANZAI->EXEC2": "LoggedOff",
    }
}

The HealthIndicator can be enabled in Spring as follows:

management.health.quickfixjclient.enabled=true
management:
  health:
    quickfixjclient:
      enabled: true

Listening on quickfixj.Application messages

The QuickFIX/J Spring Boot Starter provides a default implementation for the quickfixj.Application interface, the EventPublisherApplicationAdapter, which publishes the messages received by the Server (Acceptor) and the Client (Initiator) as ApplicationEvent`s. The `EventPublisherApplicationAdapter is provided by default, it’s not meant to be used on high throughput environments.

If your application is only processing a subset of message types (i.e. toAdmin, toApp, onCreate, etc.) you will need to register an EventListener for these, with the appropriate message type as the only parameter for the listener method:

@EventListener
public void listenFromAdmin(FromAdmin fromAdmin) {
	...
}

@EventListener
public void listenFromApp(FromApp fromApp) {
	...
}

@EventListener
public void listenOnCreate(Create create) {
	...
}

@EventListener
public void listenOnLogon(Logon logon) {
	...
}

@EventListener
public void listenOnLogout(Logout logout) {
	...
}

@EventListener
public void listenToAdmin(ToAdmin toAdmin) {
	...
}

@EventListener
public void listenToApp(ToApp toApp) {
	...
}

In case the EventListener method throws an exception, this exception will be propagated up the quickfix.Session#next() method. Depending on the value of RejectMessageOnUnhandledException in the quickfixj configuration file, the message will be redelivered or dismissed.

QuickFixJTemplate

The QuickFixJTemplate provides a synchronous client to perform requests, exposing a simple, template method API over the QuickFIX/J client.

The QuickFIX/J Spring Boot Starter provides a quickFixJTemplate bean than can be Autowired in the application.

@Autowire
private QuickFixJTemplate quickFixJTemplate;

...

SessionID sessionID = serverAcceptor.getSessions().stream()
        .filter(sessId ->
                sessId.getBeginString().equals(fixVersion) &&
                        sessId.getTargetCompID().equals(targetId))
        .findFirst()
        .orElseThrow(RuntimeException::new);

OrderCancelRequest message = new OrderCancelRequest(
        new OrigClOrdID("123"),
        new ClOrdID("321"),
        new Symbol("LNUX"),
        new Side(Side.BUY));

quickFixJTemplate.send(message, sessionID);

License and Acknowledgement

The QuickFIX/J Spring Boot Starter is released under version 2.0 of the Apache License.

This code includes software developed by quickfixengine.org.