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.
In this Spring Boot Starter, QuickFIX/J Server is equivalent to Acceptor
and QuickFIX/J Client to Initiator
.
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>3.0.1</version>
</dependency>
The QuickFIX/J Spring Boot Starter no longer includes
dependency and now includes the standard published FIX specification versions from FIX 4.0 to FIX Latest built by the QuickFIX/J project as optional dependency. They are not specified as runtime dependencies any longer, which makes it easier to customise QuickFIX/J deployments.quickfixj-messages-all
If you do not need to customise a FIX integration then you can use the
artefacts built by the QuickFIX/J project. Include them as dependencies of your application.org.quickfixj
For more information about customising the QuickFIX/J Runtime refer to https://github.com/quickfix-j/quickfixj?tab=readme-ov-file#quickfixj-runtime
For example, import the quickfixj-spring-boot-started
pom in your dependencyManagement
section:
<dependency>
<groupId>io.allune</groupId>
<artifactId>quickfixj-spring-boot-starter</artifactId>
<version>3.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
and add the specific version(s) of the FIX messages you need in your project dependencies
:
<dependency>
<groupId>io.allune</groupId>
<artifactId>quickfixj-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.quickfixj</groupId>
<artifactId>quickfixj-messages-fix44</artifactId>
</dependency>
<dependency>
<groupId>org.quickfixj</groupId>
<artifactId>quickfixj-messages-fix50</artifactId>
</dependency>
Due to the changes in how dependencies are autowired from Spring Framework 6.1 and Parameter Name Discovery, having the quickfixj client and server in the same spring context is not supported.
If you have an application that need to use both, or multiple of one, you can use the following approach to separate the Spring contexts and configurations:
public class ApplicationConfiguration {
public static void main(String[] args) {
SpringApplicationBuilder parentBuilder
= new SpringApplicationBuilder(QuickFixJCommonConfiguration.class)
.web(WebApplicationType.NONE);
parentBuilder.run(args);
parentBuilder.child(QuickFixJServerYourCompanyContextConfiguration.class)
.properties("spring.config.name=server")
.web(WebApplicationType.SERVLET).run(args);
parentBuilder.child(QuickFixJClientNDAQContextConfiguration.class)
.properties("spring.config.name=ndaq")
.web(WebApplicationType.SERVLET).run(args);
parentBuilder.child(QuickFixJClientFOREXContextConfiguration.class)
.properties("spring.config.name=forex")
.web(WebApplicationType.SERVLET).run(args);
parentBuilder.child(QuickFixJClientDOWJONESContextConfiguration.class)
.properties("spring.config.name=dow-jones")
.web(WebApplicationType.SERVLET).run(args);
}
@Configuration
public class QuickFixJCommonConfiguration {
@Bean
public QuickFixJTemplate quickFixJTemplate() {
return new QuickFixJTemplate();
}
}
@EnableAutoConfiguration
@Configuration
public class QuickFixJServerYourCompanyContextConfiguration {
// override beans if required
}
@EnableAutoConfiguration
@Configuration
public class QuickFixJClientNDAQContextConfiguration {
// override beans if required
}
@EnableAutoConfiguration
@Configuration
public class QuickFixJClientFOREXContextConfiguration {
// override beans if required
}
@EnableAutoConfiguration
@Configuration
public class QuickFixJClientDOWJONESContextConfiguration {
// override beans if required
}
}
Adding quickfixj.server.enabled=true
in your properties file will configure an Acceptor with all the default QuickFix/J components:
-
A
MessageStoreFactory
of typeMemoryStoreFactory
. -
A
LogFactory
of typeScreenLogFactory
. -
An
Acceptor
of typeSocketAcceptor
. -
An
Application
of typeEventPublisherApplicationAdapter
. -
If quickfixj.server.concurrent.useDefaultExecutorFactory is set to
true
, anExecutorFactory
is configured and added to theAcceptor
.
All these QuickFix/J components can be configured via properties or by overriding the default beans.
Note that @EnableQuickFixJServer
has been deprecated in version 3.0.1
.
For example:
@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);
}
}
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 namedserverSessionSettings
-
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
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.auto-startup |
true |
Whether to autostart the connection manager at start up (default: |
quickfixj.server.force-disconnect |
false |
Whether logged on sessions should be disconnected forcibly when the connector is stopped (default: |
quickfixj.server.phase |
0 |
Phase in which this connection manager should be started and stopped (default: |
quickfixj.server.jmx-enabled |
true |
Whether to register the jmx mbeans for the acceptor (default: |
quickfixj.server.message-store-factory |
memory |
Type of |
quickfixj.server.log-factory |
screen |
Type of |
quickfixj.server.concurrent.enabled |
true |
Whether to use a simple |
quickfixj.server.concurrent.useDefaultExecutorFactory |
true |
Whether to use a default |
quickfixj.server.concurrent.queueCapacity |
|
When using the default |
quickfixj.server.concurrent.corePoolSize |
8 |
When using the default |
quickfixj.server.concurrent.maxPoolSize |
|
When using the default |
quickfixj.server.concurrent.allowCoreThreadTimeOut |
true |
When using the default |
quickfixj.server.concurrent.keepAliveSeconds |
60 |
When using the default ExecutorFactory, the Executor’s keep alive in seconds (default: |
quickfixj.server.concurrent.waitForTasksToCompleteOnShutdown |
false |
When using the default ExecutorFactory, whether to wait for tasks to complete on shutdown on the Executor (default: |
quickfixj.server.concurrent.awaitTerminationSeconds |
0 |
When using the default ExecutorFactory, the Executor’s await termination in seconds (default: |
quickfixj.server.concurrent.threadNamePrefix |
QuickFixJ Spring Boot Starter thread- |
When using the default ExecutorFactory, the Executor’s thread name prefix (default: |
For example:
quickfixj.server.enabled=true
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:
enabled: true
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
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
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>3.0.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": "******"
}
}
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
Adding quickfixj.client.enabled=true
in your properties file will configure an Initiator with all the default QuickFix/J components:
-
A
MessageStoreFactory
of typeMemoryStoreFactory
. -
A
LogFactory
of typeScreenLogFactory
. -
An
Initiator
of typeSocketInitiator
. -
An
Application
of typeEventPublisherApplicationAdapter
. -
If quickfixj.client.concurrent.useDefaultExecutorFactory is set to
true
, anExecutorFactory
is configured and added to theInitiator
.
All these QuickFix/J components can be configured via properties or by overriding the beans.
Note that @EnableQuickFixJClient
has been deprecated in version 3.0.1
.
For example:
@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);
}
}
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 namedclientSessionSettings
-
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
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.auto-startup |
true |
Whether to autostart the connection manager at start up (default: |
quickfixj.client.force-disconnect |
false |
Whether logged on sessions should be disconnected forcibly when the connector is stopped (default: |
quickfixj.client.phase |
0 |
Phase in which this connection manager should be started and stopped (default: |
quickfixj.client.jmx-enabled |
true |
Whether to register the jmx mbeans for the initiator (default: |
quickfixj.client.message-store-factory |
memory |
Type of |
quickfixj.client.log-factory |
screen |
Type of |
quickfixj.client.concurrent.enabled |
true |
Whether to use a simple |
quickfixj.client.concurrent.useDefaultExecutorFactory |
true |
Whether to use a default |
quickfixj.client.concurrent.queueCapacity |
|
When using the default |
quickfixj.client.concurrent.corePoolSize |
8 |
When using the default |
quickfixj.client.concurrent.maxPoolSize |
|
When using the default |
quickfixj.client.concurrent.allowCoreThreadTimeOut |
true |
When using the default |
quickfixj.client.concurrent.keepAliveSeconds |
60 |
When using the default ExecutorFactory, the Executor’s keep alive in seconds (default: |
quickfixj.client.concurrent.waitForTasksToCompleteOnShutdown |
false |
When using the default ExecutorFactory, whether to wait for tasks to complete on shutdown on the Executor (default: |
quickfixj.client.concurrent.awaitTerminationSeconds |
0 |
When using the default ExecutorFactory, the Executor’s await termination in seconds (default: |
quickfixj.client.concurrent.threadNamePrefix |
QuickFixJ Spring Boot Starter thread- |
When using the default ExecutorFactory, the Executor’s thread name prefix (default: |
For example:
quickfixj.client.enabled=true
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:
enabled: true
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
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
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>3.0.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": "******"
}
}
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
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.
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);
-
QuickFIX/J Spring Boot Server and Client applications as Docker containers
-
QuickFIX/J Spring Boot Server and Client applications as Docker containers with server failover
-
QuickFIX/J Spring Boot Client application with Event Listeners
-
QuickFIX/J Spring Boot Client application with database message store
-
QuickFIX/J Spring Boot Server application with Dynamic Sessions
-
QuickFIX/J Spring Boot Server application with Event Listeners
-
QuickFIX/J Spring Boot Server application with database message store
The QuickFIX/J Spring Boot Starter is released under version 2.0 of the Apache License.
This code includes software developed by quickfixengine.org.