Index: core/src/main/java/quickfix/mina/initiator/AbstractSocketInitiator.java =================================================================== --- core/src/main/java/quickfix/mina/initiator/AbstractSocketInitiator.java (revision 1084) +++ core/src/main/java/quickfix/mina/initiator/AbstractSocketInitiator.java (working copy) @@ -61,6 +61,8 @@ protected final Logger log = LoggerFactory.getLogger(getClass()); private final Set initiators = new HashSet(); + private static final String SETTING_INACTIVE_SESSION = "Inactive"; + protected AbstractSocketInitiator(Application application, MessageStoreFactory messageStoreFactory, SessionSettings settings, LogFactory logFactory, MessageFactory messageFactory) throws ConfigError { @@ -78,52 +80,51 @@ protected void createSessionInitiators() throws ConfigError { try { - // QFJ698: clear() is needed on restart, otherwise the set gets filled up with - // more and more initiators which are not equal because the local port differs - initiators.clear(); createSessions(); - SessionSettings settings = getSettings(); for (final Session session : getSessionMap().values()) { - final SessionID sessionID = session.getSessionID(); - final int[] reconnectingIntervals = getReconnectIntervalInSeconds(sessionID); + createInitiator(session); + } + } catch (final FieldConvertError e) { + throw new ConfigError(e); + } + } - final SocketAddress[] socketAddresses = getSocketAddresses(sessionID); - if (socketAddresses.length == 0) { - throw new ConfigError("Must specify at least one socket address"); - } - - SocketAddress localAddress = getLocalAddress(settings, sessionID); + private void createInitiator(final Session session) throws ConfigError, FieldConvertError { - final NetworkingOptions networkingOptions = new NetworkingOptions(getSettings() - .getSessionProperties(sessionID, true)); + final SessionID sessionID = session.getSessionID(); + final int[] reconnectingIntervals = getReconnectIntervalInSeconds(sessionID); - boolean sslEnabled = false; - if (getSettings().isSetting(sessionID, SSLSupport.SETTING_USE_SSL)) { - sslEnabled = BooleanConverter.convert(getSettings().getString(sessionID, - SSLSupport.SETTING_USE_SSL)); - } - final String keyStoreName = SSLSupport.getKeystoreName(getSettings(), sessionID); - final String keyStorePassword = SSLSupport.getKeystorePasswd(getSettings(), - sessionID); - final String strEnableProtocole = SSLSupport.getEnableProtocole(getSettings(), - sessionID); - final String[] enableProtocole = strEnableProtocole != null ? strEnableProtocole - .split(",") : null; - final String strCipherSuites = SSLSupport.getCipherSuite(getSettings(), sessionID); - final String[] cipherSuites = strCipherSuites != null - ? strCipherSuites.split(",") - : null; + final SocketAddress[] socketAddresses = getSocketAddresses(sessionID); + if (socketAddresses.length == 0) { + throw new ConfigError("Must specify at least one socket address"); + } - final IoSessionInitiator ioSessionInitiator = new IoSessionInitiator(session, - socketAddresses, localAddress, reconnectingIntervals, getScheduledExecutorService(), - networkingOptions, getEventHandlingStrategy(), getIoFilterChainBuilder(), - sslEnabled, keyStoreName, keyStorePassword, enableProtocole, cipherSuites); + SocketAddress localAddress = getLocalAddress(getSettings(), sessionID); - initiators.add(ioSessionInitiator); - } - } catch (final FieldConvertError e) { - throw new ConfigError(e); + final NetworkingOptions networkingOptions = new NetworkingOptions(getSettings() + .getSessionProperties(sessionID, true)); + + boolean sslEnabled = false; + if (getSettings().isSetting(sessionID, SSLSupport.SETTING_USE_SSL)) { + sslEnabled = BooleanConverter.convert(getSettings().getString(sessionID, + SSLSupport.SETTING_USE_SSL)); } + final String keyStoreName = SSLSupport.getKeystoreName(getSettings(), sessionID); + final String keyStorePassword = SSLSupport.getKeystorePasswd(getSettings(), sessionID); + final String strEnableProtocole = SSLSupport.getEnableProtocole(getSettings(), sessionID); + final String[] enableProtocole = strEnableProtocole != null + ? strEnableProtocole.split(",") + : null; + final String strCipherSuites = SSLSupport.getCipherSuite(getSettings(), sessionID); + final String[] cipherSuites = strCipherSuites != null ? strCipherSuites.split(",") : null; + + final IoSessionInitiator ioSessionInitiator = new IoSessionInitiator(session, + socketAddresses, localAddress, reconnectingIntervals, + getScheduledExecutorService(), networkingOptions, getEventHandlingStrategy(), + getIoFilterChainBuilder(), sslEnabled, keyStoreName, keyStorePassword, + enableProtocole, cipherSuites); + + this.initiators.add(ioSessionInitiator); } //QFJ-482 @@ -160,8 +161,11 @@ final SessionID sessionID = i.next(); if (isInitiatorSession(sessionID)) { try { - final Session quickfixSession = createSession(sessionID); - initiatorSessions.put(sessionID, quickfixSession); + if (!settings.isSetting(sessionID, SETTING_INACTIVE_SESSION) + || !settings.getBool(sessionID, SETTING_INACTIVE_SESSION)) { + final Session quickfixSession = createSession(sessionID); + initiatorSessions.put(sessionID, quickfixSession); + } } catch (final Throwable e) { if (continueInitOnError) { log.error("error during session initialization, continuing...", e); @@ -172,12 +176,23 @@ } } } - if (initiatorSessions.isEmpty()) { - throw new ConfigError("no initiators in settings"); - } setSessions(initiatorSessions); } + public void createDynamicSession(SessionID sessionID) throws ConfigError { + + try { + final Session session = createSession(sessionID); + + super.addDynamicSession(session); + + createInitiator(session); + + } catch (final FieldConvertError e) { + throw new ConfigError(e); + } + } + private int[] getReconnectIntervalInSeconds(SessionID sessionID) throws ConfigError { final SessionSettings settings = getSettings(); if (settings.isSetting(sessionID, Initiator.SETTING_RECONNECT_INTERVAL)) {