Index: core/src/main/java/quickfix/Session.java =================================================================== --- core/src/main/java/quickfix/Session.java (revision 1114) +++ core/src/main/java/quickfix/Session.java (working copy) @@ -1289,7 +1289,10 @@ state.setLogoutReceived(true); - state.incrNextTargetMsgSeqNum(); + final int logoutMsgSeqNum = logout.getHeader().getInt(MsgSeqNum.FIELD); + if (!isTargetTooHigh(logoutMsgSeqNum)) { + state.incrNextTargetMsgSeqNum(); + } if (resetOnLogout) { resetState(); } Index: core/src/test/java/quickfix/SessionTest.java =================================================================== --- core/src/test/java/quickfix/SessionTest.java (revision 1114) +++ core/src/test/java/quickfix/SessionTest.java (working copy) @@ -345,6 +345,41 @@ } + // QFJ-750 + @Test + public void testLogoutMsgSeqNumTooHigh() throws Exception { + + final Application application = new UnitTestApplication(); + final Session session = setUpSession(application, false, new UnitTestResponder()); + final SessionState state = getSessionState(session); + + assertEquals(1, state.getNextSenderMsgSeqNum()); + assertEquals(1, state.getNextTargetMsgSeqNum()); + + logonTo(session); + + assertEquals(2, state.getNextSenderMsgSeqNum()); + assertEquals(2, state.getNextTargetMsgSeqNum()); + + final TestRequest testRequest = (TestRequest) createAdminMessage(2); + session.next(testRequest); + + assertEquals(3, state.getNextSenderMsgSeqNum()); + assertEquals(3, state.getNextTargetMsgSeqNum()); + + logoutFrom(session, 100); + assertFalse("Session should be disconnected", session.isLoggedOn()); + + // make sure that the target seq num has not been incremented + assertEquals(4, state.getNextSenderMsgSeqNum()); + assertEquals(3, state.getNextTargetMsgSeqNum()); + logonTo(session, 3); + assertEquals(5, state.getNextSenderMsgSeqNum()); + assertEquals(4, state.getNextTargetMsgSeqNum()); + assertTrue("Session should be connected", session.isLoggedOn()); + + } + /** * QFJ-357 * Until QF/J 1.5.1 the behaviour was observed that a Logout message was always sent as first message. @@ -1114,6 +1149,14 @@ session.next(receivedLogon); } + private void logoutFrom(Session session, int sequence) throws FieldNotFound, RejectLogon, + IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType, IOException, + InvalidMessage { + final Logout receivedLogout = new Logout(); + setUpHeader(session.getSessionID(), receivedLogout, true, sequence); + session.next(receivedLogout); + } + private void setUpHeader(SessionID sessionID, Message message, boolean reversed, int sequence) { message.getHeader().setString(TargetCompID.FIELD, reversed ? sessionID.getSenderCompID() : sessionID.getTargetCompID());