Skip to content

Commit 940e568

Browse files
authored
Merge pull request #638 from AndreyNudko/socket-connect-timeout
Introduce `SocketConnectTimeout` configuration option
2 parents 3427f08 + 561d1a8 commit 940e568

File tree

4 files changed

+29
-7
lines changed

4 files changed

+29
-7
lines changed

quickfixj-core/src/main/doc/usermanual/usage/configuration.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,13 @@ <H3>QuickFIX Settings</H3>
509509
<TD> valid IP address in the format of x.x.x.x or a domain name </TD>
510510
<TD>&nbsp; </TD>
511511
</TR>
512+
<TR ALIGN="left" VALIGN="middle">
513+
<TD> <I>SocketConnectTimeout</I> </TD>
514+
515+
<TD> Connection timeout in seconds. Only used with a SocketInitiator </TD>
516+
<TD> positive integer </TD>
517+
<TD> 60 </TD>
518+
</TR>
512519
<TR ALIGN="left" VALIGN="middle">
513520

514521
<TD> <I>SocketConnectProtocol</I> </TD>

quickfixj-core/src/main/java/quickfix/Initiator.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,14 @@ public interface Initiator extends Connector {
5353
*/
5454
String SETTING_SOCKET_CONNECT_PORT = "SocketConnectPort";
5555

56+
/**
57+
* Initiator setting for connection timeout. Only valid when session connection
58+
* type is "initiator".
59+
*
60+
* @see quickfix.SessionFactory#SETTING_CONNECTION_TYPE
61+
*/
62+
String SETTING_SOCKET_CONNECT_TIMEOUT = "SocketConnectTimeout";
63+
5664
/**
5765
* Initiator setting for local/bind host. Only valid when session connection
5866
* type is "initiator".

quickfixj-core/src/main/java/quickfix/mina/initiator/AbstractSocketInitiator.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,10 @@ private void createInitiator(final Session session, final boolean continueInitOn
124124
throw new ConfigError("Must specify at least one socket address");
125125
}
126126

127-
SocketAddress localAddress = getLocalAddress(settings, session);
127+
// 1 minute by default, matches MINA
128+
int connectTimeout = getSettings().getIntOrDefault(sessionID, Initiator.SETTING_SOCKET_CONNECT_TIMEOUT, 60);
128129

130+
SocketAddress localAddress = getLocalAddress(settings, session);
129131
final NetworkingOptions networkingOptions = new NetworkingOptions(getSettings()
130132
.getSessionProperties(sessionID, true));
131133

@@ -175,7 +177,7 @@ && getSettings().isSetting(sessionID, Initiator.SETTING_PROXY_DOMAIN)) {
175177
ScheduledExecutorService scheduledExecutorService = (scheduledReconnectExecutor != null ? scheduledReconnectExecutor : getScheduledExecutorService());
176178
try {
177179
final IoSessionInitiator ioSessionInitiator = new IoSessionInitiator(session,
178-
socketAddresses, localAddress, reconnectingIntervals,
180+
socketAddresses, localAddress, connectTimeout, reconnectingIntervals,
179181
scheduledExecutorService, settings, networkingOptions,
180182
getEventHandlingStrategy(), getIoFilterChainBuilder(), sslEnabled, sslConfig,
181183
proxyType, proxyVersion, proxyHost, proxyPort, proxyUser, proxyPassword, proxyDomain, proxyWorkstation);

quickfixj-core/src/main/java/quickfix/mina/initiator/IoSessionInitiator.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,20 +65,23 @@ public class IoSessionInitiator {
6565
private Future<?> reconnectFuture;
6666

6767
public IoSessionInitiator(Session fixSession, SocketAddress[] socketAddresses,
68-
SocketAddress localAddress, int[] reconnectIntervalInSeconds,
68+
SocketAddress localAddress, int connectTimeout, int[] reconnectIntervalInSeconds,
6969
ScheduledExecutorService executor, SessionSettings sessionSettings, NetworkingOptions networkingOptions,
7070
EventHandlingStrategy eventHandlingStrategy,
7171
IoFilterChainBuilder userIoFilterChainBuilder, boolean sslEnabled, SSLConfig sslConfig,
7272
String proxyType, String proxyVersion, String proxyHost, int proxyPort,
7373
String proxyUser, String proxyPassword, String proxyDomain, String proxyWorkstation) throws ConfigError {
7474
this.executor = executor;
75+
76+
final long connectTimeoutMillis = connectTimeout * 1000L;
7577
final long[] reconnectIntervalInMillis = new long[reconnectIntervalInSeconds.length];
7678
for (int ii = 0; ii != reconnectIntervalInSeconds.length; ++ii) {
7779
reconnectIntervalInMillis[ii] = reconnectIntervalInSeconds[ii] * 1000L;
7880
}
81+
7982
try {
8083
reconnectTask = new ConnectTask(sslEnabled, socketAddresses, localAddress,
81-
userIoFilterChainBuilder, fixSession, reconnectIntervalInMillis,
84+
userIoFilterChainBuilder, fixSession, connectTimeoutMillis, reconnectIntervalInMillis,
8285
sessionSettings, networkingOptions, eventHandlingStrategy, sslConfig,
8386
proxyType, proxyVersion, proxyHost, proxyPort, proxyUser, proxyPassword, proxyDomain, proxyWorkstation, log);
8487
} catch (GeneralSecurityException e) {
@@ -95,6 +98,7 @@ private static class ConnectTask implements Runnable {
9598
private final IoFilterChainBuilder userIoFilterChainBuilder;
9699
private IoConnector ioConnector;
97100
private final Session fixSession;
101+
private final long connectTimeoutMillis;
98102
private final long[] reconnectIntervalInMillis;
99103
private final SessionSettings sessionSettings;
100104
private final NetworkingOptions networkingOptions;
@@ -120,7 +124,7 @@ private static class ConnectTask implements Runnable {
120124

121125
public ConnectTask(boolean sslEnabled, SocketAddress[] socketAddresses,
122126
SocketAddress localAddress, IoFilterChainBuilder userIoFilterChainBuilder,
123-
Session fixSession, long[] reconnectIntervalInMillis,
127+
Session fixSession, long connectTimeoutMillis, long[] reconnectIntervalInMillis,
124128
SessionSettings sessionSettings, NetworkingOptions networkingOptions, EventHandlingStrategy eventHandlingStrategy, SSLConfig sslConfig,
125129
String proxyType, String proxyVersion, String proxyHost,
126130
int proxyPort, String proxyUser, String proxyPassword, String proxyDomain,
@@ -130,6 +134,7 @@ public ConnectTask(boolean sslEnabled, SocketAddress[] socketAddresses,
130134
this.localAddress = localAddress;
131135
this.userIoFilterChainBuilder = userIoFilterChainBuilder;
132136
this.fixSession = fixSession;
137+
this.connectTimeoutMillis = connectTimeoutMillis;
133138
this.reconnectIntervalInMillis = reconnectIntervalInMillis;
134139
this.sessionSettings = sessionSettings;
135140
this.networkingOptions = networkingOptions;
@@ -161,9 +166,9 @@ private void setupIoConnector() throws ConfigError, GeneralSecurityException {
161166

162167
ioFilterChainBuilder.addLast(FIXProtocolCodecFactory.FILTER_NAME, new ProtocolCodecFilter(new FIXProtocolCodecFactory()));
163168

164-
IoConnector newConnector;
165-
newConnector = ProtocolFactory.createIoConnector(socketAddresses[nextSocketAddressIndex]);
169+
IoConnector newConnector = ProtocolFactory.createIoConnector(socketAddresses[nextSocketAddressIndex]);
166170
networkingOptions.apply(newConnector);
171+
newConnector.setConnectTimeoutMillis(connectTimeoutMillis);
167172
newConnector.setHandler(new InitiatorIoHandler(fixSession, sessionSettings, networkingOptions, eventHandlingStrategy));
168173
newConnector.setFilterChainBuilder(ioFilterChainBuilder);
169174

0 commit comments

Comments
 (0)