Skip to content

Commit 395cac3

Browse files
authored
AcceptorTemplate sessions do no longer work (#386)
* Added unit test that will expose problem with template session * Moved logic for template session into `setupSession()` method. - now usage of socket descriptor is more clear
1 parent 1126a4f commit 395cac3

File tree

2 files changed

+37
-9
lines changed

2 files changed

+37
-9
lines changed

quickfixj-core/src/main/java/quickfix/mina/acceptor/AbstractSocketAcceptor.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,8 @@ private IoAcceptor getIoAcceptor(AcceptorSocketDescriptor socketDescriptor) thro
164164
return ioAcceptor;
165165
}
166166

167-
private AcceptorSocketDescriptor getAcceptorSocketDescriptor(SessionSettings settings,
168-
SessionID sessionID) throws ConfigError, FieldConvertError {
167+
private void setupSession(SessionSettings settings, SessionID sessionID, boolean isTemplate, Map<SessionID, Session> allSessions)
168+
throws ConfigError, FieldConvertError {
169169
int acceptTransportType = ProtocolFactory.SOCKET;
170170
if (settings.isSetting(sessionID, Acceptor.SETTING_SOCKET_ACCEPT_PROTOCOL)) {
171171
try {
@@ -210,7 +210,11 @@ && getSettings().getBool(sessionID, SSLSupport.SETTING_USE_SSL)) {
210210
socketDescriptorForAddress.put(acceptorAddress, descriptor);
211211
}
212212

213-
return descriptor;
213+
if (!isTemplate) {
214+
Session session = sessionFactory.create(sessionID, settings);
215+
descriptor.acceptSession(session);
216+
allSessions.put(sessionID, session);
217+
}
214218
}
215219

216220
private boolean equals(Object object1, Object object2) {
@@ -238,12 +242,7 @@ private void createSessions(SessionSettings settings, boolean continueInitOnErro
238242
}
239243
}
240244

241-
if (!isTemplate) {
242-
AcceptorSocketDescriptor descriptor = getAcceptorSocketDescriptor(settings, sessionID);
243-
Session session = sessionFactory.create(sessionID, settings);
244-
descriptor.acceptSession(session);
245-
allSessions.put(sessionID, session);
246-
}
245+
setupSession(settings, sessionID, isTemplate, allSessions);
247246
}
248247
} catch (Throwable t) {
249248
if (continueInitOnError) {

quickfixj-core/src/test/java/quickfix/SocketAcceptorTest.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,35 @@ public void testAcceptorContinueInitializationOnError() throws ConfigError, Inte
247247
acceptor.stop();
248248
}
249249

250+
/**
251+
* Ensure that an Acceptor can be started that only has a template session.
252+
*/
253+
@Test
254+
public void testAcceptorTemplate() throws ConfigError, InterruptedException, IOException {
255+
final int port = AvailablePortFinder.getNextAvailable();
256+
final SessionSettings settings = new SessionSettings();
257+
final SessionID sessionId = new SessionID("FIX.4.4", "SENDER", "TARGET");
258+
settings.setString("ConnectionType", "acceptor");
259+
settings.setString("StartTime", "00:00:00");
260+
settings.setString("EndTime", "00:00:00");
261+
settings.setString("HeartBtInt", "30");
262+
settings.setString("BeginString", "FIX.4.4");
263+
settings.setLong(sessionId, "SocketAcceptPort", port);
264+
settings.setString(sessionId, Acceptor.SETTING_ACCEPTOR_TEMPLATE, "Y");
265+
266+
final SocketAcceptor acceptor = new SocketAcceptor(new ApplicationAdapter(), new MemoryStoreFactory(), settings,
267+
new ScreenLogFactory(settings), new DefaultMessageFactory());
268+
acceptor.start();
269+
270+
for (IoAcceptor endpoint : acceptor.getEndpoints()) {
271+
boolean containsFIXCodec = endpoint.getFilterChain().contains(FIXProtocolCodecFactory.FILTER_NAME);
272+
assertTrue(containsFIXCodec);
273+
}
274+
275+
acceptor.stop();
276+
}
277+
278+
250279
private void checkThreads(ThreadMXBean bean, int expectedNum) {
251280
ThreadInfo[] dumpAllThreads = bean.dumpAllThreads(false, false);
252281
int qfjMPThreads = 0;

0 commit comments

Comments
 (0)